时间:2025-08-21 11:50
人气:
作者:admin
透明度测试与透明度混合(Blend)互斥,需根据需求选择其一!
【从UnityURP开始探索游戏渲染】专栏-直达
透明度测试(Alpha Test)是一种通过阈值筛选片元的硬性透明方案,其核心逻辑是通过clip()函数比较片元Alpha值与预设阈值_Cutoff:当Alpha低于阈值时直接丢弃片元,反之则完整渲染。
Queue="AlphaTest"标签实现基础功能,但存在:
Alpha Clip Threshold属性"Queue"="AlphaTest"(值2450),确保在透明物体前渲染Always/Never 可完全绕过测试,减少GPU分支判断NotEqual)可能增加片元着色器指令数| 函数指令 | 逻辑条件 | 典型应用场景 |
|---|---|---|
Greater |
alpha > 阈值 (_Cutoff) |
硬边遮罩(如树叶镂空) |
GEqual |
alpha ≥ 阈值 | 半透明边缘抗锯齿优化 |
Less |
alpha < 阈值 | 反向遮罩(如洞孔效果) |
LEqual |
alpha ≤ 阈值 | 透明渐变剔除 |
Equal |
alpha == 阈值 | 精确匹配特定透明度 |
NotEqual |
alpha != 阈值 | 排除特定透明值 |
Always |
始终通过测试 | 强制禁用透明度测试 |
Never |
始终丢弃片元 | 完全隐藏物体 |
SubShader {
Pass {
// 启用AlphaTest并设置比较模式
AlphaTest Greater 0.5 // 仅保留alpha>0.5的片元
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
uniform float _Cutoff; // 阈值变量
fixed4 frag (v2f i) : SV_Target {
fixed4 col = tex2D(_MainTex, i.uv);
clip(col.a - _Cutoff); // 等效于AlphaTest Greater
return col;
}
ENDCG
}
}
注:clip() 函数在片元着色器中可直接实现阈值比较,与 AlphaTest 指令效果等价
_Cutoff),用于控制 alpha 的临界值_Cutoff 比较;若未达标,则使用 clip() 或 discard 指令丢弃片元,阻止其进入后续测试【从UnityURP开始探索游戏渲染】专栏-直达
(欢迎点赞留言探讨,更多人加入进来能更加完善这个探索的过程,????)