版本:Unity 6 (6000.0)
语言:English
内置渲染管线中的网格法线着色器示例
内置渲染管线中的法线贴图着色器示例

内置渲染管线中的反射着色器示例

当在天空盒一种用于表示天空的特殊材质类型。通常是六面体。更多信息
参见 术语表
用作场景场景包含游戏环境和菜单。可以将每个唯一的场景文件视为一个唯一的关卡。在每个场景中,您放置环境、障碍物和装饰,本质上是分段设计和构建游戏。更多信息
参见 术语表
中的反射源(参见灯光窗口)时,则会创建一个本质上是“默认”的反射探针一个渲染组件,可以捕获其周围环境的球形视图,就像相机一样。然后捕获的图像将存储为立方体贴图,可以由具有反射材质的对象使用。更多信息
参见 术语表
,其中包含天空盒数据。反射探针在内部是一个立方体贴图六个方形纹理的集合,可以表示环境中的反射或几何体后面绘制的天空盒。六个正方形形成围绕对象的假想立方体的面;每个面都表示沿世界轴方向(上、下、左、右、前和后)的视图。更多信息
参见 术语表
纹理;我们将扩展世界空间法线着色器在 GPU 上运行的程序。更多信息
参见 术语表
以查看它。

到目前为止,代码开始变得有点复杂。当然,如果您希望着色器能够自动与灯光、阴影、反射和照明系统的其余部分一起工作,那么使用表面着色器一种简化内置渲染管线着色器编写的方式。更多信息
参见 术语表
会容易得多。此示例旨在向您展示如何以“手动”方式使用照明系统的一部分。

Shader "Unlit/SkyReflection"
{
    SubShader
    {
        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"

            struct v2f {
                half3 worldRefl : TEXCOORD0;
                float4 pos : SV_POSITION;
            };

            v2f vert (float4 vertex : POSITION, float3 normal : NORMAL)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(vertex);
                // compute world space position of the vertex
                float3 worldPos = mul(_Object2World, vertex).xyz;
                // compute world space view direction
                float3 worldViewDir = normalize(UnityWorldSpaceViewDir(worldPos));
                // world space normal
                float3 worldNormal = UnityObjectToWorldNormal(normal);
                // world space reflection vector
                o.worldRefl = reflect(-worldViewDir, worldNormal);
                return o;
            }
        
            fixed4 frag (v2f i) : SV_Target
            {
                // sample the default reflection cubemap, using the reflection vector
                half4 skyData = UNITY_SAMPLE_TEXCUBE(unity_SpecCube0, i.worldRefl);
                // decode cubemap data into actual color
                half3 skyColor = DecodeHDR (skyData, unity_SpecCube0_HDR);
                // output it!
                fixed4 c = 0;
                c.rgb = skyColor;
                return c;
            }
            ENDCG
        }
    }
}

上面的示例使用了内置着色器包含文件中的几个内容

  • unity_SpecCube0unity_SpecCube0_HDRObject2WorldUNITY_MATRIX_MVP来自内置着色器变量unity_SpecCube0包含活动反射探针的数据。
  • UNITY_SAMPLE_TEXCUBE是用于采样立方体贴图的内置宏。大多数常规立方体贴图使用标准 HLSL 语法(samplerCUBEtexCUBE)进行声明和使用,但是 Unity 中的反射探针立方体贴图以特殊方式声明以节省采样器插槽。如果您不知道这是什么,请不要担心,只需知道为了使用unity_SpecCube0立方体贴图,您必须使用UNITY_SAMPLE_TEXCUBE宏。
  • 来自UnityCG.cgincUnityWorldSpaceViewDir函数,以及来自同一文件的DecodeHDR函数。后者用于从反射探针数据中获取实际颜色——因为 Unity 以特殊编码方式存储反射探针立方体贴图。
  • reflect只是一个内置的 HLSL 函数,用于计算围绕给定法线的向量反射。
内置渲染管线中的网格法线着色器示例
内置渲染管线中的法线贴图着色器示例