版本:Unity 6 (6000.0)
语言:英语
在 URP 中编写具有颜色输入的非光照着色器
在 URP 的着色器中可视化法线向量

在 URP 的着色器中绘制纹理

此示例中的 Unity 着色器在 GPU 上运行的程序。 更多信息
参见 术语表
网格Unity 的主要图形基元。 网格构成 3D 世界的很大一部分。 Unity 支持三角形或四边形多边形网格。 Nurbs、Nurms、细分曲面必须转换为多边形。 更多信息
参见 术语表
上绘制纹理。

使用第 URP 非光照着色器,具有颜色输入 节中的 Unity 着色器源文件,并对 ShaderLabUnity 用于定义着色器对象结构的语言。 更多信息
参见 术语表
代码进行以下更改

  1. 在 Properties 块中,用 _BaseMap 属性定义替换现有代码。

    Properties
    {
        [MainTexture] _BaseMap("Base Map", 2D) = "white" {}
    }
    

    在 Properties 块中声明纹理属性时,Unity 会将带标签 Base Map_BaseMap 属性添加到材质,并添加平铺和偏移控件。

    Texture property with Tiling and Offset controls
    “具有平铺和偏移控件的纹理属性”

    当用 [MainTexture] 属性声明属性时,Unity 会将此属性用作材质的 主纹理

    注意:出于兼容性原因,_MainTex 属性名称是保留名称。 即使没有 [MainTexture] 属性,Unity 也使用名称为 _MainTex 的属性作为 主纹理

  2. struct Attributesstruct Varyings 中,添加用于纹理上 UV 坐标的 uv 变量

    float2 uv           : TEXCOORD0;
    
  3. 将纹理定义为 2D 纹理,并为其指定采样器。 在 CBUFFER 块之前添加以下几行

    TEXTURE2D(_BaseMap);
    SAMPLER(sampler_BaseMap);
    

    TEXTURE2D 和 SAMPLER 宏在 Core.hlsl 中引用的文件中定义。

  4. 为了使平铺和偏移正常工作,有必要在 'CBUFFER' 块中使用 _ST 后缀声明纹理属性。 _ST 后缀是必要的,因为一些宏(例如,TRANSFORM_TEX)使用它。

    注意:为了确保 Unity 着色器与 SRP Batcher 兼容,请在名为 UnityPerMaterial 的单个 CBUFFER 块中声明所有材质属性。 有关 SRP Batcher 的更多信息,请参阅 可脚本化渲染管线 (SRP) Batcher 上的文档。

    CBUFFER_START(UnityPerMaterial)
        float4 _BaseMap_ST;
    CBUFFER_END
    
  5. 要应用平铺和偏移变换,请在 顶点着色器在渲染 3D 模型时针对模型的每个顶点运行的程序。 更多信息
    参见 术语表
    中添加以下行

    OUT.uv = TRANSFORM_TEX(IN.uv, _BaseMap);
    

    TRANSFORM_TEX 宏在 Macros.hlsl 文件中定义。 #include 声明包含对该文件的引用。

  6. 在片段着色器中,使用 SAMPLE_TEXTURE2D 宏对纹理进行采样

    half4 frag(Varyings IN) : SV_Target
    {
        half4 color = SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, IN.uv);
        return color;
    }
    

现在,您可以在 检视器一个 Unity 窗口,用于显示有关当前选定游戏对象、资源或项目设置的信息,允许您检查和编辑这些值。 更多信息
参见 术语表
窗口的 Base Map 字段中选择纹理。 着色器会在网格上绘制该纹理。

Base Map texture on a Material
材质上的 Base Map 纹理

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

// This shader draws a texture on the mesh.
Shader "Example/URPUnlitShaderTexture"
{
    // The _BaseMap variable is visible in the Material's Inspector, as a field
    // called Base Map.
    Properties
    {
        [MainTexture] _BaseMap("Base Map", 2D) = "white" {}
    }

    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;
                // The uv variable contains the UV coordinate on the texture for the
                // given vertex.
                float2 uv           : TEXCOORD0;
            };

            struct Varyings
            {
                float4 positionHCS  : SV_POSITION;
                // The uv variable contains the UV coordinate on the texture for the
                // given vertex.
                float2 uv           : TEXCOORD0;
            };

            // This macro declares _BaseMap as a Texture2D object.
            TEXTURE2D(_BaseMap);
            // This macro declares the sampler for the _BaseMap texture.
            SAMPLER(sampler_BaseMap);

            CBUFFER_START(UnityPerMaterial)
                // The following line declares the _BaseMap_ST variable, so that you
                // can use the _BaseMap variable in the fragment shader. The _ST
                // suffix is necessary for the tiling and offset function to work.
                float4 _BaseMap_ST;
            CBUFFER_END

            Varyings vert(Attributes IN)
            {
                Varyings OUT;
                OUT.positionHCS = TransformObjectToHClip(IN.positionOS.xyz);
                // The TRANSFORM_TEX macro performs the tiling and offset
                // transformation.
                OUT.uv = TRANSFORM_TEX(IN.uv, _BaseMap);
                return OUT;
            }

            half4 frag(Varyings IN) : SV_Target
            {
                // The SAMPLE_TEXTURE2D marco samples the texture with the given
                // sampler.
                half4 color = SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, IN.uv);
                return color;
            }
            ENDHLSL
        }
    }
}

可视化法线向量 节介绍了如何在网格上可视化法线向量。

在 URP 中编写具有颜色输入的非光照着色器
在 URP 的着色器中可视化法线向量