Version: 6000.3
语言: 中文
内置渲染管线中的网格法线着色器示例
内置渲染管线中的法线贴图纹理着色器示例

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

一个类似猫的角色,具有反射场景的金属表面。
一个类似猫的角色,具有反射场景的金属表面。

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

现在,代码开始有点参与。当然,如果你想要着色器能够自动处理灯光、阴影、反射和照明系统的其余部分,那么它使用起来会更容易表面着色器内置渲染管线编写着色器的简化方法。更多信息
请参阅术语表
.此示例旨在向您展示如何以“手动”方式使用照明系统的各个部分。

Shader "Unlit/SkyReflection"
{
    SubShader
    {
        Pass
        {
            HLSLPROGRAM
            #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;
            }
            ENDHLSL
        }
    }
}

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

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