Unity Shader 透明度测试和透明度混合
关于透明度测试和透明度混合的理论部分可以翻阅上一篇博客 【Unity Shader】(8)透明度测试与透明度混合的理论基础,本节主要是根据《Unity Shader入门精要》,将代码整理。
1、透明度测试
概念:只要一个片元的透明度不满足条件(通常是小于设定的阈值),那么其对应的片元就会被舍弃。(被舍弃意味着——不会进行任何处理,包括颜色缓冲),如果大于设定的阈值,则会按照普通的不透明度物体的处理方式来处理该片元。
方法:通常是在片元着色器中,使用clip函数进行透明度测试。
函数:clip(),等同于:
void clip(float4 v)
{
if(any(x<0))
discard;
}
代码开始
①新建一个Shader之后,清空其中的代码。
②添加我们的属性代码,即Properties:
Properties{
_Color ("Base Color",Color) = (1,1,1,1)
_MainTex("Main Tex",2D) = "white"{
}
_Cutoff("Alpha Cutoff",Range(0,1)) = 0.5
}
其中,Cutoff就是我们设定的透明度阈值。范围是0~1,因为纹理像素的透明度就是在这个范围内。
③编写我们的SubShader语义块
SubShader{
Tags{
"Queue"="AlphaTest" "IgnoreProjector"+"Ture" "RenderType"="TransparentCutout"}
Pass{
Tags{
"LightMode"="ForwardBase"}
}
}
这里有所不同的是,我们在Pass之外设置了三个tags。
| 标签 | 作用 |
|---|---|
| Queue | 渲染队列设置为“透明度测试” |
| RenderType | 让Unity把该Shader归入到提前定义好的TransparentCutout组中(指明该Shader是一个使用了透明度测试的Shader) |
| IgnoreProjectors | 设置为True,意味着该Shader将不受投影器(Projector)的影响 |
通常,使用透明度测试AlphaTest的Shader都需要在SubShader中设置上面三个标签。
④补充CGPROGRAM
⑤完整代码
// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'
Shader"LeonShader/Shader_8_3_AlphaTest"
{
Properties{
_Color ("Base Color",Color) = (1,1,1,1)
_MainTex(

本文详细介绍了Unity Shader中的透明度测试和透明度混合,通过示例代码展示了如何使用clip函数进行透明度测试,并探讨了开启深度写入、双面透明在透明度混合中的应用,帮助理解透明效果的实现原理。
最低0.47元/天 解锁文章
1465

被折叠的 条评论
为什么被折叠?



