注意:本文档中的 ShaderLabUnity 定义着色器对象结构的语言。 更多信息
请参见 词汇表 功能现已过时,仅出于向后兼容的目的而记录。如果您的 着色器在 GPU 上运行的程序。 更多信息
请参见 词汇表 源文件中包含 HLSL 代码,则 Unity 会完全忽略这些命令。如果您的着色器源文件中不包含 HLSL 代码,则 Unity 会在导入时将这些命令编译为常规着色器程序。
功能名称 | 内置 渲染管道将场景内容放置到屏幕上显示的一系列操作。您可以选择预先构建的渲染管道或自行编写。 更多信息 请参见 词汇表 |
通用渲染管道 (URP) | 高清渲染管道 (HDRP) | 自定义 SRP |
---|---|---|---|---|
旧版纹理合并 | 是 | 否 | 否 | 否 |
计算完基本的顶点光照后,就开始应用纹理。在 ShaderLab 中,使用 SetTexture 命令来完成此操作。
固定功能纹理定位是执行旧式合并器的效果之处。您可以在 Pass 内使用多个 SetTexture 命令 - 所有纹理会按顺序应用,就像绘画程序中的图层一样。SetTexture 命令必须放在 Pass 的末尾。
SetTexture [TextureName] {Texture Block}
分配纹理。TextureName 必须定义为纹理属性。如何在纹理块内应用纹理取决于 TextureBlock。
纹理块控制纹理的应用方式。纹理块最多可以包含两个命令:combine
和 constantColor
。
combine
命令
combine
src1 * src2:将 src1 和 src2 相乘。结果会比任一输入都深。
combine
src1 + src2: 将 src1 和 src2 相加。结果将比任一输入值浅。
combine
src1 - src2: 从 src1 中减去 src2。
combine
src1 lerp
(src2) src3: 使用 src2 的 alpha,在 src3 和 src1 之间插值。注意插值方向相反:alpha 为 1 时使用 src1,alpha 为 0 时使用 src3。
combine
src1 * src2 + src3: 将 src1 与 src2 的 alpha 分量相乘,然后加上 src3。
所有 src 属性都可以是 previous、constant、primary 或 texture 中的任意一个。
修改器
lerp
参数之外,所有 src 属性在前面可选择加上 one - 使得所得颜色取反。ConstantColor
命令ConstantColor color: 定义可在合并命令中使用的常量颜色。
5.0 之前的 Unity 版本支持使用纹理块内的 matrix
命令对纹理坐标进行转换。如果您现在需要此功能,请考虑将着色器重写为 可编程着色器,并在 顶点着色器3D 模型在渲染时在其每个顶点上运行的程序。 更多信息
请参见 术语表 中进行 UV 转换。
类似地,5.0 移除了有符号加法 (a+-b
)、有符号加法乘 (a*b+-c
)、乘法减法 (a*b-c
) 和点乘 (dot3
、dot3rgba
) 纹理组合模式。如果需要它们,请在 像素计算机图像中的最小单位。像素大小取决于您的屏幕分辨率。像素照明在每个屏幕像素处计算。 更多信息
请参阅 词汇表 着色器中进行数学运算。
在 片段程序 诞生之前,较老的显卡采用分层方法处理纹理。这些纹理会逐个应用,修改将要写到屏幕上的颜色。对于每个纹理,纹理通常与前一个操作的结果相结合。当今建议使用实际片段程序。
请注意,每个纹理阶段可能会或可能不会被固定到 0..1 范围,具体取决于平台。这可能会影响能够产生高于 1.0 值的 SetTexture 阶段。
默认情况下,组合器公式用于计算颜色的 RGB 和 Alpha 分量。您还可以为 Alpha 计算指定一个单独的公式。如下所示
SetTexture [_MainTex] { combine previous * texture, previous + texture }
在此,我们乘以 RGB 颜色并添加 Alpha。
默认情况下,主要颜色是漫射色、环境光和 镜面色镜面高光的颜色。
请参阅 词汇表(如 照明计算 中定义的那样)的总和。如果您在通过选项中指定独立镜面 On,镜面色将在组合器计算之后而不是之前添加。这是内置 VertexLit 着色器的默认行为。
支持 片段着色器 的现代显卡(台式机上的“着色器模型 2.0”)支持所有 SetTexture 模式,且至少支持 4 个纹理阶段(其中许多支持 8 个)。如果您正在运行非常旧的硬件(PC 上 2003 年前制造的,或移动设备上 iPhone3GS 之前制造的),您可能会只有两个纹理阶段。着色器作者应为他们想要支持的显卡编写单独的 子着色器。
这个小型示例采用了两个纹理。首先,它设置第一个组合器只是取_MainTex,然后使用_BlendTex 的 Alpha 通道淡入_BlendTex 的 RGB 颜色
Shader "Examples/2 Alpha Blended Textures" {
Properties {
_MainTex ("Base (RGB)", 2D) = "white" {}
_BlendTex ("Alpha Blended (RGBA) ", 2D) = "white" {}
}
SubShader {
Pass {
// Apply base texture
SetTexture [_MainTex] {
combine texture
}
// Blend in the alpha texture using the lerp operator
SetTexture [_BlendTex] {
combine texture lerp (texture) previous
}
}
}
}
该着色器使用 **_MainTex** 的 alpha 组件来决定在何处应用光照。它通过将纹理应用于两个阶段来实现此目的;在第一阶段,使用纹理的 alpha 值在顶点颜色和纯白色之间进行混合。在第二阶段,将纹理的 RGB 值相乘。
Shader "Examples/Self-Illumination" {
Properties {
_MainTex ("Base (RGB) Self-Illumination (A)", 2D) = "white" {}
}
SubShader {
Pass {
// Set up basic white vertex lighting
Material {
Diffuse (1,1,1,1)
Ambient (1,1,1,1)
}
Lighting On
// Use texture alpha to blend up to white (= full illumination)
SetTexture [_MainTex] {
constantColor (1,1,1,1)
combine constant lerp(texture) previous
}
// Multiply in texture
SetTexture [_MainTex] {
combine previous * texture
}
}
}
}
不过,我们可以在此免费执行其他操作;不是与纯白色混合,而是可以添加一个自发光颜色并混合到该颜色。请注意,使用 **ConstantColor** 从属性获取 _SolidColor,将其混合到纹理中。
Shader "Examples/Self-Illumination 2" {
Properties {
_IlluminCol ("Self-Illumination color (RGB)", Color) = (1,1,1,1)
_MainTex ("Base (RGB) Self-Illumination (A)", 2D) = "white" {}
}
SubShader {
Pass {
// Set up basic white vertex lighting
Material {
Diffuse (1,1,1,1)
Ambient (1,1,1,1)
}
Lighting On
// Use texture alpha to blend up to white (= full illumination)
SetTexture [_MainTex] {
// Pull the color property into this blender
constantColor [_IlluminCol]
// And use the texture's alpha to blend between it and
// vertex color
combine constant lerp(texture) previous
}
// Multiply in texture
SetTexture [_MainTex] {
combine previous * texture
}
}
}
}
最后,我们要采用 vertexlit 着色器的所有光照属性,并将其拉入
Shader "Examples/Self-Illumination 3" {
Properties {
_IlluminCol ("Self-Illumination color (RGB)", Color) = (1,1,1,1)
_Color ("Main Color", Color) = (1,1,1,0)
_SpecColor ("Spec Color", Color) = (1,1,1,1)
_Emission ("Emmisive Color", Color) = (0,0,0,0)
_Shininess ("Shininess", Range (0.01, 1)) = 0.7
_MainTex ("Base (RGB)", 2D) = "white" {}
}
SubShader {
Pass {
// Set up basic vertex lighting
Material {
Diffuse [_Color]
Ambient [_Color]
Shininess [_Shininess]
Specular [_SpecColor]
Emission [_Emission]
}
Lighting On
// Use texture alpha to blend up to white (= full illumination)
SetTexture [_MainTex] {
constantColor [_IlluminCol]
combine constant lerp(texture) previous
}
// Multiply in texture
SetTexture [_MainTex] {
combine previous * texture
}
}
}
}