此示例中的 Unity 着色器在 GPU 上运行的程序。 更多信息
参见 术语表 在 网格Unity 的主要图形基元。 网格构成 3D 世界的很大一部分。 Unity 支持三角形或四边形多边形网格。 Nurbs、Nurms、细分曲面必须转换为多边形。 更多信息
参见 术语表 上绘制纹理。
使用第 URP 非光照着色器,具有颜色输入 节中的 Unity 着色器源文件,并对 ShaderLabUnity 用于定义着色器对象结构的语言。 更多信息
参见 术语表 代码进行以下更改
在 Properties 块中,用 _BaseMap
属性定义替换现有代码。
Properties
{
[MainTexture] _BaseMap("Base Map", 2D) = "white" {}
}
在 Properties 块中声明纹理属性时,Unity 会将带标签 Base Map 的 _BaseMap
属性添加到材质,并添加平铺和偏移控件。
当用 [MainTexture]
属性声明属性时,Unity 会将此属性用作材质的 主纹理。
注意:出于兼容性原因,
_MainTex
属性名称是保留名称。 即使没有[MainTexture]
属性,Unity 也使用名称为_MainTex
的属性作为 主纹理。
在 struct Attributes
和 struct Varyings
中,添加用于纹理上 UV 坐标的 uv
变量
float2 uv : TEXCOORD0;
将纹理定义为 2D 纹理,并为其指定采样器。 在 CBUFFER 块之前添加以下几行
TEXTURE2D(_BaseMap);
SAMPLER(sampler_BaseMap);
TEXTURE2D 和 SAMPLER 宏在 Core.hlsl
中引用的文件中定义。
为了使平铺和偏移正常工作,有必要在 'CBUFFER' 块中使用 _ST
后缀声明纹理属性。 _ST
后缀是必要的,因为一些宏(例如,TRANSFORM_TEX
)使用它。
注意:为了确保 Unity 着色器与 SRP Batcher 兼容,请在名为
UnityPerMaterial
的单个CBUFFER
块中声明所有材质属性。 有关 SRP Batcher 的更多信息,请参阅 可脚本化渲染管线 (SRP) Batcher 上的文档。
CBUFFER_START(UnityPerMaterial)
float4 _BaseMap_ST;
CBUFFER_END
要应用平铺和偏移变换,请在 顶点着色器在渲染 3D 模型时针对模型的每个顶点运行的程序。 更多信息
参见 术语表 中添加以下行
OUT.uv = TRANSFORM_TEX(IN.uv, _BaseMap);
TRANSFORM_TEX
宏在 Macros.hlsl
文件中定义。 #include
声明包含对该文件的引用。
在片段着色器中,使用 SAMPLE_TEXTURE2D
宏对纹理进行采样
half4 frag(Varyings IN) : SV_Target
{
half4 color = SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, IN.uv);
return color;
}
现在,您可以在 检视器一个 Unity 窗口,用于显示有关当前选定游戏对象、资源或项目设置的信息,允许您检查和编辑这些值。 更多信息
参见 术语表 窗口的 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
}
}
}
第 可视化法线向量 节介绍了如何在网格上可视化法线向量。