Unity3D ShaderLab 简单的立方体图反射
反射是着色器模拟现实环境的一个关键因素,它能使我们的着色器渲染效果更加具备视觉冲击,因为他利用了我们周围的环境,
让着色器反射外界的场景信息并将他们反射到材质表面来模拟外部环境,所以我们会使用立方图【CubeMap】的6张纹理来模拟环境的色彩情况。
首先,创建Shader,创建材质球,准备立方图,双击Shader,进入代码编辑器。
如果没有立方体图可以使用天空盒暂代,或者通过Unity的Camera相机渲染到一个立方贴图,具体的创建方法,参见api:
http://www.unitymanual.com/m/Script/Camera.RenderToCubemap.html
从Properties 到CGPROGRAM,再到surf,本次功能较为简单,先看代码。
code start -----------------------------------------------------------------------
Shader "91YGame/Cube1" { Properties { _MainTint("Diffuse Tint",Color)=(,,,) _MainTex ("Base (RGB)", 2D) = "white" {} _CubeMap("CubeMap",CUBE)=""{} _ReflAmount("Reflection Amount",Range(0.1,))=0.5 } SubShader { Tags { "RenderType"="Opaque" } LOD CGPROGRAM #pragma surface surf Lambert sampler2D _MainTex; samplerCUBE _CubeMap; float4 _MainTint; float _ReflAmount; struct Input { float2 uv_MainTex; float3 worldRefl; }; void surf (Input IN, inout SurfaceOutput o) { half4 c = tex2D (_MainTex, IN.uv_MainTex)*_MainTint; o.Emission = texCUBE(_CubeMap,IN.worldRefl).rgb*_ReflAmount; o.Albedo = c.rgb; o.Alpha = c.a; } ENDCG } FallBack "Diffuse" }
code end ------------------------------------------------------------------------
通过上面的简单修改,我们也获得了简单的立方体图反射效果,在Unity中可以直接查看效果。
总结看来,着色器对立方图进行采样,并得到一个类似真实的反射。
这要归功于Unity在表面着色器的Input结构体中内置的worldRefl属性,他为我们直接提供了必要的反射向量,
帮助我们的立方图进行正确采样。我们只需要在texCube函数中使用worldRefl变量,即可得到正确的反射图。