注意:此页上的 ShaderLabUnity 用于定义着色器对象结构的语言。 更多信息
在 术语表 中查看 功能已过时,仅出于向后兼容性目的进行记录。如果你的 着色器在 GPU 上运行的程序。 更多信息
在 术语表 中查看 源文件包含 HLSL 代码,Unity 会完全忽略这些命令。如果你的着色器源文件不包含 HLSL 代码,Unity 会在导入时将这些命令编译成常规着色器程序。
功能名称 | 内置 渲染管线一系列操作,将场景内容显示在屏幕上。Unity 允许你从预构建的渲染管线中选择,或编写自己的渲染管线。 更多信息 在 术语表 中查看 |
通用渲染管线 (URP) | 高清渲染管线 (HDRP) | 自定义 SRP |
---|---|---|---|---|
传统 Alpha 测试 | 是 | 否 | 否 | 否 |
在最终输出颜色计算完成后,可以选择将颜色的 Alpha 值与固定值进行比较。如果测试失败,像素计算机图像中的最小单位。像素大小取决于你的屏幕分辨率。每个屏幕像素都会计算像素光照。 更多信息
在 术语表 中查看 不会写入显示器。
AlphaTest Off
渲染所有像素(默认)或…
AlphaTest comparison AlphaValue
设置 Alpha 测试,仅渲染 Alpha 值在特定范围内的像素。
比较是以下单词之一
大于 | 仅渲染 Alpha 值大于 AlphaValue 的像素。 |
大于等于 | 仅渲染 Alpha 值大于或等于 AlphaValue 的像素。 |
小于 | 仅渲染 Alpha 值小于 AlphaValue 的像素。 |
小于等于 | 仅渲染 Alpha 值小于或等于 AlphaValue 的像素。 |
等于 | 仅渲染 Alpha 值等于 AlphaValue 的像素。 |
不等于 | 仅渲染 Alpha 值与 AlphaValue 不同的像素。 |
始终 | 渲染所有像素。这在功能上等效于 AlphaTest Off。 |
从不 | 不渲染任何像素。 |
介于 0 到 1 之间的浮点数。这也可以是浮点数或范围属性的变量引用,在这种情况下,应使用标准方括号表示法 ([VariableName]) 编写。
渲染具有透明部分的凹形物体时,Alpha 测试非常重要。显卡会维护一个记录写入屏幕的每个像素深度的记录。如果新像素比已经渲染的像素更远,则不会将新像素写入显示器。这意味着即使使用 混合,物体也不会显示出来。
在此图中,左侧的树木使用 AlphaTest 渲染。注意其中的像素是完全透明的,或是完全不透明的。中间的树木仅使用 Alpha Blending 渲染 - 注意透明部分的附近树枝如何覆盖远处的树叶,这是由于 深度缓冲区一个存储器,用于保存图像中每个像素的 z 值深度,其中 z 值是每个渲染像素从投影平面到深度。 更多信息
在 术语表 中查看 造成的。右侧的树木使用最后一个示例着色器渲染 - 该着色器实现混合和 Alpha 测试的组合来隐藏任何伪影。
最简单的示例,将具有 Alpha 通道的纹理分配给它。物体仅在 Alpha 大于 0.5 的情况下可见
Shader "Simple Alpha Test" {
Properties {
_MainTex ("Base (RGB) Transparency (A)", 2D) = "" {}
}
SubShader {
Pass {
// Only render pixels with an alpha larger than 50%
AlphaTest Greater 0.5
SetTexture [_MainTex] { combine texture }
}
}
}
这本身并不十分有用。让我们添加一些光照,并使截止值可调整
Shader "Cutoff Alpha" {
Properties {
_MainTex ("Base (RGB) Transparency (A)", 2D) = "" {}
_Cutoff ("Alpha cutoff", Range (0,1)) = 0.5
}
SubShader {
Pass {
// Use the Cutoff parameter defined above to determine
// what to render.
AlphaTest Greater [_Cutoff]
Material {
Diffuse (1,1,1,1)
Ambient (1,1,1,1)
}
Lighting On
SetTexture [_MainTex] { combine texture * primary }
}
}
}
渲染植物和树木时,许多游戏都有 Alpha 测试典型的硬边。一种解决方法是渲染物体两次。在第一次传递中,我们使用 Alpha 测试仅渲染不透明度超过 50% 的像素。在第二次传递中,我们对被剪切掉的部件进行 Alpha 混合,而不记录像素的深度。我们可能会遇到一些混淆,因为更远的树枝会覆盖附近的树枝,但实际上,由于树叶有很多视觉细节,所以很难看出来。
Shader "Vegetation" {
Properties {
_Color ("Main Color", Color) = (.5, .5, .5, .5)
_MainTex ("Base (RGB) Alpha (A)", 2D) = "white" {}
_Cutoff ("Base Alpha cutoff", Range (0,.9)) = .5
}
SubShader {
// Set up basic lighting
Material {
Diffuse [_Color]
Ambient [_Color]
}
Lighting On
// Render both front and back facing polygons.
Cull Off
// first pass:
// render any pixels that are more than [_Cutoff] opaque
Pass {
AlphaTest Greater [_Cutoff]
SetTexture [_MainTex] {
combine texture * primary, texture
}
}
// Second pass:
// render in the semitransparent details.
Pass {
// Dont write to the depth buffer
ZWrite off
// Don't write pixels we have already written.
ZTest Less
// Only render pixels less or equal to the value
AlphaTest LEqual [_Cutoff]
// Set up alpha blending
Blend SrcAlpha OneMinusSrcAlpha
SetTexture [_MainTex] {
combine texture * primary, texture
}
}
}
}
请注意,我们在 SubShader 内部进行了一些设置,而不是在各个传递中进行设置。在 SubShader 中设置的任何状态都会被其内部传递中的默认值继承。