【Unity Shader】(9)透明度测试 和 透明度混合 的案例与分析

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

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(
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值