unity2019 内置管线实时折射反射shader
时间: 2023-06-27 17:08:01 浏览: 107
Unity2019内置管线(Universal Render Pipeline)提供了可以实现实时折射和反射的Shader。
在URP中,可以使用内置的Lit Shader来实现实时折射和反射。下面是一个简单的示例:
```
Shader "Custom/LitRefractionReflection" {
Properties {
_MainTex ("Base (RGB)", 2D) = "white" {}
_NormalMap ("Normal Map", 2D) = "bump" {}
_Metallic ("Metallic", Range(0,1)) = 0.0
_Smoothness ("Smoothness", Range(0,1)) = 0.5
_Color ("Color", Color) = (1,1,1,1)
_RefractiveIndex ("Refractive Index", Range(1.0, 2.0)) = 1.5
}
SubShader {
Tags { "RenderType"="Opaque" }
CGPROGRAM
#pragma surface surf Standard
struct Input {
float3 worldPos;
float3 worldNormal;
float3 worldRefl;
float3 worldViewDir;
float2 uv_MainTex;
};
sampler2D _MainTex;
sampler2D _NormalMap;
float _Metallic;
float _Smoothness;
fixed4 _Color;
float _RefractiveIndex;
void surf (Input IN, inout SurfaceOutputStandard o) {
// Diffuse
o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb * _Color.rgb;
// Metallic
o.Metallic = _Metallic;
// Smoothness
o.Smoothness = _Smoothness;
// Normal Map
o.Normal = UnpackNormal (tex2D (_NormalMap, IN.uv_MainTex));
// Refraction
float3 refractionVector = refract(IN.worldViewDir, IN.worldNormal, _RefractiveIndex);
o.Refraction = tex2D(_MainTex, IN.uv_MainTex + refractionVector.xy * 0.1).rgb;
// Reflection
o.Metallic = 1.0;
o.Smoothness = 1.0;
o.Reflectivity = 1.0;
o.Normal = IN.worldNormal;
o.Alpha = 0.0;
}
ENDCG
}
FallBack "Diffuse"
}
```
这个Shader实现了基本的漫反射、法线贴图、金属度、光滑度,以及折射和反射效果。可以通过调整_RefractiveIndex来修改材质的折射率,从而改变折射效果。
需要注意的是,在URP中实现实时折射和反射需要使用屏幕空间技术,因此需要在摄像机上添加一个反射探针(Reflection Probe)组件来捕获场景中的反射信息。