版本:Unity 6 (6000.0)
语言:英语
在 URP 着色器中绘制纹理
在 URP 着色器中重建世界空间坐标

在 URP 着色器中可视化法线向量

此示例中的 Unity 着色器在 GPU 上运行的程序。 更多信息
请参阅 词汇表
网格Unity 的主要图形基元。网格构成了 3D 世界的大部分。Unity 支持三角剖分或四边剖分的多边形网格。Nurbs、Nurms、细分区面必须转换为多边形。 更多信息
请参阅 词汇表
上可视化法线向量值。

使用来自部分的 Unity 着色器源文件URP 未点亮基本着色器,对 ShaderLabUnity 用于定义着色器对象结构的语言。 更多信息
请参阅 词汇表
代码进行以下更改

  1. struct Attributes中(此示例中 顶点着色器的输入结构),声明包含每个顶点法线向量的变量。

    struct Attributes
    {
        float4 positionOS   : POSITION;
        // Declaring the variable containing the normal vector for each vertex.
        half3 normal        : NORMAL;
    };
    
  2. struct Varyings中(此示例中片段着色器的输入结构),声明变量以存储每个片段的法线向量值

    struct Varyings
    {
        float4 positionHCS  : SV_POSITION;
        // The variable for storing the normal vector values.
        half3 normal        : TEXCOORD0;
    };
    

    此示例使用法线向量的三个分量作为每个片段的 RGB 颜色值。

  3. 要呈现网格上的法线向量值,使用以下代码作为片段着色器

    half4 frag(Varyings IN) : SV_Target
    {
        half4 color = 0;
        color.rgb = IN.normal;
        return color;
    }
    
  4. Unity 呈现网格上的法线向量值

    Rendering normals without compression
    无压缩呈现法线

    胶囊的一部分是黑色的。这是因为在这些点中,法线向量的所有三个分量都是负数。下一步显示了如何在这些区域内呈现数值。

  5. 要渲染负法线向量分量,请使用压缩一种存储数据的方法,可以减少所需存储空间量。请参阅纹理压缩动画压缩音频压缩构建压缩
    请参阅术语表
    技术。要将法线分量值的范围(-1..1)压缩到颜色值范围(0..1),请更改以下行

    color.rgb = IN.normal;
    

    为该行

    color.rgb = IN.normal * 0.5 + 0.5;
    

现在 Unity 会将法线向量值作为颜色渲染到网格上。

Rendering normals with compression
使用压缩渲染法线

下面是此示例的完整 ShaderLab 代码。

// This shader visuzlizes the normal vector values on the mesh.
Shader "Example/URPUnlitShaderNormal"
{
    Properties
    { }

    SubShader
    {
        Tags { "RenderType" = "Opaque" "RenderPipeline" = "UniversalPipeline" }

        Pass
        {
            HLSLPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"

            struct Attributes
            {
                float4 positionOS   : POSITION;
                // Declaring the variable containing the normal vector for each
                // vertex.
                half3 normal        : NORMAL;
            };

            struct Varyings
            {
                float4 positionHCS  : SV_POSITION;
                half3 normal        : TEXCOORD0;
            };

            Varyings vert(Attributes IN)
            {
                Varyings OUT;
                OUT.positionHCS = TransformObjectToHClip(IN.positionOS.xyz);
                // Use the TransformObjectToWorldNormal function to transform the
                // normals from object to world space. This function is from the
                // SpaceTransforms.hlsl file, which is referenced in Core.hlsl.
                OUT.normal = TransformObjectToWorldNormal(IN.normal);
                return OUT;
            }

            half4 frag(Varyings IN) : SV_Target
            {
                half4 color = 0;
                // IN.normal is a 3D vector. Each vector component has the range
                // -1..1. To show all vector elements as color, including the
                // negative values, compress each value into the range 0..1.
                color.rgb = IN.normal * 0.5 + 0.5;
                return color;
            }
            ENDHLSL
        }
    }
}
在 URP 着色器中绘制纹理
在 URP 着色器中重建世界空间坐标