Version: 6000.3
语言: 中文
内置渲染管线中的雾着色器示例
着色器故障排除

在内置渲染管线中可视化顶点数据着色器示例

这些例子着色器在 GPU 上运行的程序。更多信息
请参阅术语表
对于内置渲染管线(Render Pipeline) 获取场景内容并将其显示在屏幕上的一系列作。Unity 允许您从预构建的渲染管道中进行选择,或编写自己的渲染管道。更多信息
请参阅术语表
演示可视化顶点数据的不同方法。

有关编写着色器的信息,请参阅 编写着色器

可视化UV

以下示例着色器可视化了meshUnity 的主要图形原语。网格体构成了 3D 世界的很大一部分。Unity 支持三角或四边形多边形网格。Nurbs、Nurms、Subdiv 曲面必须转换为多边形。更多信息
请参阅术语表
.此着色器可用于调试坐标。

该代码定义了一个名为appdata作为其顶点着色器 渲染模型时在 3D 模型的每个顶点上运行的程序。更多信息
请参阅术语表
输入。此结构体将顶点位置和第一个纹理坐标作为其输入。

Shader "Debug/UV 1" {
SubShader {
    Pass {
        HLSLPROGRAM
        #pragma vertex vert
        #pragma fragment frag
            #include "UnityCG.cginc"

        // vertex input: position, UV
        struct appdata {
            float4 vertex : POSITION;
            float4 texcoord : TEXCOORD0;
        };

        struct v2f {
            float4 pos : SV_POSITION;
            float4 uv : TEXCOORD0;
        };
        
        v2f vert (appdata v) {
            v2f o;
            o.pos = UnityObjectToClipPos(v.vertex);
            o.uv = float4( v.texcoord.xy, 0, 0 );
            return o;
        }
        
        half4 frag( v2f i ) : SV_Target {
            half4 c = frac( i.uv );
            if (any(saturate(i.uv) - i.uv))
                c.b = 0.5;
            return c;
        }
        ENDHLSL
    }
}
}

在这里,UV 坐标可视化为红色和绿色,而额外的蓝色色调已应用于 0 到 1 范围之外的坐标:

调试应用于环面结模型的 UV1 着色器
调试应用于环面结模型的 UV1 着色器

同一着色器上的此变体可视化了第二个 UV 集:

Shader "Debug/UV 2" {
SubShader {
    Pass {
        HLSLPROGRAM
        #pragma vertex vert
        #pragma fragment frag
            #include "UnityCG.cginc"

        // vertex input: position, second UV
        struct appdata {
            float4 vertex : POSITION;
            float4 texcoord1 : TEXCOORD1;
        };

        struct v2f {
            float4 pos : SV_POSITION;
            float4 uv : TEXCOORD0;
        };
        
        v2f vert (appdata v) {
            v2f o;
            o.pos = UnityObjectToClipPos(v.vertex );
            o.uv = float4( v.texcoord1.xy, 0, 0 );
            return o;
        }
        
        half4 frag( v2f i ) : SV_Target {
            half4 c = frac( i.uv );
            if (any(saturate(i.uv) - i.uv))
                c.b = 0.5;
            return c;
        }
        ENDHLSL
    }
}
}

可视化顶点颜色

以下着色器使用顶点位置和每个顶点颜色作为顶点着色器输入 (在结构 appdata 中定义) 。

Shader "Debug/Vertex color" {
SubShader {
    Pass {
        HLSLPROGRAM
        #pragma vertex vert
        #pragma fragment frag
        #include "UnityCG.cginc"

        // vertex input: position, color
        struct appdata {
            float4 vertex : POSITION;
            fixed4 color : COLOR;
        };

        struct v2f {
            float4 pos : SV_POSITION;
            fixed4 color : COLOR;
        };
        
        v2f vert (appdata v) {
            v2f o;
            o.pos = UnityObjectToClipPos(v.vertex );
            o.color = v.color;
            return o;
        }
        
        fixed4 frag (v2f i) : SV_Target { return i.color; }
        ENDHLSL
    }
}
}
调试颜色着色器应用于环形结模型,该模型将光照烘焙为颜色
调试颜色着色器应用于环形结模型,该模型将光照烘焙为颜色

可视化法线

以下着色器使用顶点位置和法线作为顶点着色器输入 (在结构 appdata 中定义) 。法线的 X、Y 和 Z 分量以 RGB 颜色可视化。由于法线分量在 –1 到 1 的范围内,因此我们对其进行缩放和偏置,以便输出颜色可在 0 到 1 的范围内显示。

Shader "Debug/Normals" {
SubShader {
    Pass {
        HLSLPROGRAM
        #pragma vertex vert
        #pragma fragment frag
        #include "UnityCG.cginc"

        // vertex input: position, normal
        struct appdata {
            float4 vertex : POSITION;
            float3 normal : NORMAL;
        };

        struct v2f {
            float4 pos : SV_POSITION;
            fixed4 color : COLOR;
        };
        
        v2f vert (appdata v) {
            v2f o;
            o.pos = UnityObjectToClipPos(v.vertex );
            o.color.xyz = v.normal * 0.5 + 0.5;
            o.color.w = 1.0;
            return o;
        }
        
        fixed4 frag (v2f i) : SV_Target { return i.color; }
        ENDHLSL
    }
}
}
调试法线着色器应用于环形结模型。您可以看到模型具有硬阴影边缘。
调试法线着色器应用于环形结模型。您可以看到模型具有硬阴影边缘。

可视化切线和双法线

切线和双法线向量用于法线贴图。在 Unity 中,只有切线向量存储在顶点中,双法线从法线值和切线值派生。

以下着色器使用顶点位置和切线作为顶点着色器输入 (在结构 appdata 中定义) 。切线的 x、y 和 z 分量以 RGB 颜色可视化。由于法线分量在 –1 到 1 的范围内,因此我们对其进行缩放和偏置,使输出颜色处于可显示的 0 到 1 范围内。

Shader "Debug/Tangents" {
SubShader {
    Pass {
        HLSLPROGRAM
        #pragma vertex vert
        #pragma fragment frag
        #include "UnityCG.cginc"

        // vertex input: position, tangent
        struct appdata {
            float4 vertex : POSITION;
            float4 tangent : TANGENT;
        };

        struct v2f {
            float4 pos : SV_POSITION;
            fixed4 color : COLOR;
        };
        
        v2f vert (appdata v) {
            v2f o;
            o.pos = UnityObjectToClipPos(v.vertex );
            o.color = v.tangent * 0.5 + 0.5;
            return o;
        }
        
        fixed4 frag (v2f i) : SV_Target { return i.color; }
        ENDHLSL
    }
}
}
调试应用于环面结模型的切线着色器。
调试应用于环面结模型的切线着色器。

以下着色器可视化了双色调。它使用顶点位置、法线和切线值作为顶点输入。双色(有时称为 binormal)是根据法线值和切线值计算的。它需要缩放并偏置到可显示的 0 到 1 范围内。

Shader "Debug/Bitangents" {
SubShader {
    Pass {
        Fog { Mode Off }
        HLSLPROGRAM
        #pragma vertex vert
        #pragma fragment frag
        #include "UnityCG.cginc"

        // vertex input: position, normal, tangent
        struct appdata {
            float4 vertex : POSITION;
            float3 normal : NORMAL;
            float4 tangent : TANGENT;
        };

        struct v2f {
            float4 pos : SV_POSITION;
            float4 color : COLOR;
        };
        
        v2f vert (appdata v) {
            v2f o;
            o.pos = UnityObjectToClipPos(v.vertex );
            // calculate bitangent
            float3 bitangent = cross( v.normal, v.tangent.xyz ) * v.tangent.w;
            o.color.xyz = bitangent * 0.5 + 0.5;
            o.color.w = 1.0;
            return o;
        }
        
        fixed4 frag (v2f i) : SV_Target { return i.color; }
        ENDHLSL
    }
}
}
调试应用于环形结模型的 Bitangents 着色器。
调试应用于环形结模型的 Bitangents 着色器。
内置渲染管线中的雾着色器示例
着色器故障排除