Refration - 折射
struct Input {
float2 uv_MainTex
float2 uv_BumpMap
float3 viewDir
//因为这里使用了Normal map,所以要使用INTERNAL_DATA
float3 worldRefl
float3 worldNormal
}
samplerCUBE _Cubemap
float _ReflAmount
fixed4 _Color
void surf (Input IN, inout SurfaceOutput o) {
// Albedo comes from a texture tinted by color
fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color
o.Albedo = c.rgb
//如果不使用Normal map的话,是可以直接操作Normal和viewDir的,但是一旦改变了Normal
//就必须用WorldNormalVector 和 WorldReflectionVector 来做法线和反射向量。
//o.Normal = -o.Normal
//IN.viewDir = -IN.viewDir
//因为使用了Normal map,所以下面的操作就必须基于WorldNormalVector和WorldReflectionVector
//特别要注意的是,此时除了o.Normal之外,是万万不能使用了IN.viewDir的,因为IN.viewDir的参考系也变了
o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap)).rgb
float3 back = 0.9*texCUBE(_Cubemap, normalize( -1.2* WorldNormalVector( IN, o.Normal) + 1* WorldReflectionVector (IN, o.Normal)) ).rgb*_ReflAmount
//很简单的改动Normal后的求反射光线的做法
float3 front = 0.3 * texCUBE(_Cubemap, WorldReflectionVector ( IN, o.Normal)).rgb*_ReflAmount
o.Emission = back + front
o.Alpha = c.a
}