带有颜色输入的 URP 无光照着色器
此示例中的 Unity 着色器将 Base Color 属性添加到材质。您可以使用该属性选择颜色,然后着色器就会使用这一颜色填充网格形状。
使用 URP 无光照基本着色器一节中的 Unity 着色器源文件,并对 ShaderLab 代码进行以下更改:
将
_BaseColor
属性定义添加到 Properties 代码块:Properties { [MainColor] _BaseColor("Base Color", Color) = (1, 1, 1, 1) }
此声明将带有 Base Color 标签的
_BaseColor
属性添加到材质:使用
[MainColor]
特性声明一个属性时,Unity 使用这个属性作为材质的主色。注意:出于兼容性原因,
_Color
属性名称是保留名称。Unity 使用名为_Color
的属性作为主色,即使它没有[MainColor]
特性也是如此。在 Properties 代码块中声明一个属性时,也需要在 HLSL 代码中声明它。
注意:为确保 Unity 着色器与 SRP Batcher 兼容,请在名为
UnityPerMaterial
的单个CBUFFER
代码块中声明所有材质属性。有关 SRP Batcher 的更多信息,请参阅可编程渲染管线 SRP Batcher 页面。在顶点着色器之前添加以下代码:
CBUFFER_START(UnityPerMaterial) half4 _BaseColor; CBUFFER_END
更改片元着色器中的代码,使其返回
_BaseColor
属性。half4 frag() : SV_Target { return _BaseColor; }
现在可以在 Inspector 窗口的 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
}
}
}
绘制纹理一节介绍了如何在网格上绘制纹理。