Version: 6000.3
语言: 中文
内置渲染管线中的三平面纹理着色器示例
内置渲染管线中的环境光着色器示例

内置渲染管线中的简单漫反射光照着色器示例

使用简单的漫反射照明照亮一个类似猫的角色,因此背对光线的表面要暗得多。
使用简单的漫反射照明照亮一个类似猫的角色,因此背对光线的表面要暗得多。

我们需要做的第一件事是表明我们的着色器在 GPU 上运行的程序。更多信息
请参阅术语表
实际上确实需要将照明信息传递给它。Unity 的渲染管道支持多种渲染方式;在这里,我们将使用默认的前向渲染一种渲染路径,用于在一个或多个通道中渲染每个对象,具体取决于影响对象的光源。光源本身也因前向渲染而异,具体取决于其设置和强度。更多信息
请参阅术语表
一。

我们将首先仅支持一个定向光源。Unity 中的前向渲染的工作原理是渲染主定向光、环境光、光照贴图(lightmaps一种预渲染的纹理,包含光源对场景中静态对象的效果。光照贴图覆盖在场景几何体之上,以创建光照效果。更多信息
请参阅术语表
以及名为 ForwardBase 的单通道中的反射。在着色器中,这可以通过添加传递标记来指示:Tags {“LightMode”=“ForwardBase”}。这将使定向光源数据通过一些内置变量传递到着色器中。

下面是计算每个顶点的简单漫反射光照的着色器,并使用单个主纹理:

Shader "Lit/Simple Diffuse"
{
    Properties
    {
        [NoScaleOffset] _MainTex ("Texture", 2D) = "white" {}
    }
    SubShader
    {
        Pass
        {
            // indicate that our pass is the "base" pass in forward
            // rendering pipeline. It gets ambient and main directional
            // light data set up; light direction in _WorldSpaceLightPos0
            // and color in _LightColor0
            Tags {"LightMode"="ForwardBase"}
        
            HLSLPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc" // for UnityObjectToWorldNormal
            #include "UnityLightingCommon.cginc" // for _LightColor0

            struct v2f
            {
                float2 uv : TEXCOORD0;
                fixed4 diff : COLOR0; // diffuse lighting color
                float4 vertex : SV_POSITION;
            };

            v2f vert (appdata_base v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = v.texcoord;
                // get vertex normal in world space
                half3 worldNormal = UnityObjectToWorldNormal(v.normal);
                // dot product between normal and light direction for
                // standard diffuse (Lambert) lighting
                half nl = max(0, dot(worldNormal, _WorldSpaceLightPos0.xyz));
                // factor in the light color
                o.diff = nl * _LightColor0;
                return o;
            }
            
            sampler2D _MainTex;

            fixed4 frag (v2f i) : SV_Target
            {
                // sample texture
                fixed4 col = tex2D(_MainTex, i.uv);
                // multiply by lighting
                col *= i.diff;
                return col;
            }
            ENDHLSL
        }
    }
}

这使得物体对光的方向做出反应——它面向光线的部分被照亮,而面向光线的部分根本不被照亮。

内置渲染管线中的三平面纹理着色器示例
内置渲染管线中的环境光着色器示例