docs.unity3d.com
    显示 / 隐藏目录

    带有颜色输入的 URP 无光照着色器

    此示例中的 Unity 着色器将 Base Color 属性添加到材质。您可以使用该属性选择颜色,然后着色器就会使用这一颜色填充网格形状。

    使用 URP 无光照基本着色器一节中的 Unity 着色器源文件,并对 ShaderLab 代码进行以下更改:

    1. 将_BaseColor 属性定义添加到 Properties 代码块:

      Properties
      {
          [MainColor] _BaseColor("Base Color", Color) = (1, 1, 1, 1)
      }
      

      此声明将带有 Base Color 标签的 _BaseColor 属性添加到材质:

      材质的 Base Color 属性

      使用 [MainColor] 特性声明一个属性时,Unity 使用这个属性作为材质的主色。

      注意:出于兼容性原因,_Color 属性名称是保留名称。Unity 使用名为 _Color 的属性作为主色,即使它没有 [MainColor] 特性也是如此。

    2. 在 Properties 代码块中声明一个属性时,也需要在 HLSL 代码中声明它。

      注意:为确保 Unity 着色器与 SRP Batcher 兼容,请在名为 UnityPerMaterial 的单个 CBUFFER 代码块中声明所有材质属性。有关 SRP Batcher 的更多信息,请参阅可编程渲染管线 SRP Batcher 页面。

      在顶点着色器之前添加以下代码:

      CBUFFER_START(UnityPerMaterial)
          half4 _BaseColor;
      CBUFFER_END
      
    3. 更改片元着色器中的代码,使其返回 _BaseColor 属性。

      half4 frag() : SV_Target
      {
          return _BaseColor;
      }
      

    现在可以在 Inspector 窗口的 Base Color 字段中选择颜色。片元着色器使用您选择的颜色来填充网格。

    材质的 Base Color 字段

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

    // 此着色器使用可由用户通过材质 Inspector 窗口更改的颜色来
    //填充网格形状。
    Shader "Example/URPUnlitShaderColor"
    {
        // _BaseColor 变量在材质的 Inspector 中显示为一个名为
        // Base Color 的字段。您可以使用它来选择自定义颜色。此变量的
        // 默认值为 (1, 1, 1, 1)。
        Properties
        {
            [MainColor] _BaseColor("Base Color", Color) = (1, 1, 1, 1)
        }
    
        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;
                };
    
                struct Varyings
                {
                    float4 positionHCS  : SV_POSITION;
                };
    
                // 要使 Unity 着色器 SRP Batcher 兼容,请在
                // 名为 UnityPerMaterial 的单个 CBUFFER 代码块中声明与材质
                // 相关的所有属性。
                CBUFFER_START(UnityPerMaterial)
                    // 以下行声明了 _BaseColor 变量,以便
                    // 可以在片元着色器中使用它。
                    half4 _BaseColor;
                CBUFFER_END
    
                Varyings vert(Attributes IN)
                {
                    Varyings OUT;
                    OUT.positionHCS = TransformObjectToHClip(IN.positionOS.xyz);
                    return OUT;
                }
    
                half4 frag() : SV_Target
                {
                    // 返回 _BaseColor 值。
                    return _BaseColor;
                }
                ENDHLSL
            }
        }
    }
    

    绘制纹理一节介绍了如何在网格上绘制纹理。

    返回到顶部
    Copyright © 2023 Unity Technologies — 商标和使用条款
    • 法律条款
    • 隐私政策
    • Cookie
    • 不要出售或分享我的个人信息
    • Your Privacy Choices (Cookie Settings)