顶点着色器:
// 将坐标转换到裁剪空间
o.pos = UnityObjectToClipPos(vertex);
// 计算顶点的世界坐标
float3 worldPos = mul(_Object2World, vertex).xyz;
// 计算世界空间下的视角方向
float3 worldViewDir = normalize(UnityWorldSpaceViewDir(worldPos));
// 世界空间下的法线
float3 worldNormal = UnityObjectToWorldNormal(normal);
// 世界空间下的反射向量
o.worldRefl = reflect(-worldViewDir, worldNormal);
片段着色器
// 采样纹理并返回数据
fixed4 col = tex2D(_MainTex, i.uv);
// 使用反射向量采样默认的反射立体纹理(unity_SpecCube0)
half4 skyData = UNITY_SAMPLE_TEXCUBE(unity_SpecCube0, i.worldRefl);
// 解码cubemap的数据到具体显示的颜色
half3 skyColor = DecodeHDR (skyData, unity_SpecCube0_HDR);
网友评论