此示例中的 Unity 着色器在 GPU 上运行的程序。 更多信息
参见 术语表 将 基本颜色 属性添加到材质中。您可以使用该属性选择颜色,着色器将使用该颜色填充 网格Unity 的主要图形基元。网格构成了 3D 世界的重要组成部分。Unity 支持三角形或四边形多边形网格。NURBS、NURMS、细分曲面必须转换为多边形。 更多信息
参见 术语表 形状。
使用“URP 基本无光照着色器”部分中的 Unity 着色器源文件,并对 ShaderLabUnity 用于定义着色器对象结构的语言。 更多信息
参见 术语表 代码进行以下更改
将 _BaseColor
属性定义添加到 Properties 块
Properties
{
[MainColor] _BaseColor("Base Color", Color) = (1, 1, 1, 1)
}
此声明将标签为 基本颜色 的 _BaseColor
属性添加到材质中
当您使用 [MainColor]
属性声明属性时,Unity 会将此属性用作材质的 主颜色。
注意:出于兼容性原因,
_Color
属性名称是保留名称。Unity 使用名称为_Color
的属性作为 主颜色,即使它没有[MainColor]
属性。
当您在 Properties 块中声明属性时,您还需要在 HLSL 代码中声明它。
注意:为了确保 Unity 着色器与 SRP Batcher 兼容,请在名为
UnityPerMaterial
的单个CBUFFER
块内声明所有材质属性。有关 SRP Batcher 的更多信息,请参阅有关 可脚本化渲染管线 (SRP) Batcher 的文档。
在 顶点着色器在渲染模型时,在 3D 模型的每个顶点上运行的程序。 更多信息
参见 术语表 之前添加以下代码
CBUFFER_START(UnityPerMaterial)
half4 _BaseColor;
CBUFFER_END
更改片段着色器中的代码,使其返回 _BaseColor
属性。
half4 frag() : SV_Target
{
return _BaseColor;
}
现在,您可以在“检查器”窗口的 基本颜色 字段中选择颜色。片段着色器将使用您选择的颜色填充网格。
以下是此示例的完整 ShaderLab 代码。
// This shader fills the mesh shape with a color that a user can change using the
// Inspector window on a Material.
Shader "Example/URPUnlitShaderColor"
{
// The _BaseColor variable is visible in the Material's Inspector, as a field
// called Base Color. You can use it to select a custom color. This variable
// has the default value (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;
};
// To make the Unity shader SRP Batcher compatible, declare all
// properties related to a Material in a a single CBUFFER block with
// the name UnityPerMaterial.
CBUFFER_START(UnityPerMaterial)
// The following line declares the _BaseColor variable, so that you
// can use it in the fragment shader.
half4 _BaseColor;
CBUFFER_END
Varyings vert(Attributes IN)
{
Varyings OUT;
OUT.positionHCS = TransformObjectToHClip(IN.positionOS.xyz);
return OUT;
}
half4 frag() : SV_Target
{
// Returning the _BaseColor value.
return _BaseColor;
}
ENDHLSL
}
}
}
“绘制纹理”部分介绍了如何在网格上绘制纹理。