【unity shader 入门精要】CH8 透明效果

本文深入探讨Unity中透明效果的实现,包括透明度测试和透明度混合。透明度测试通过裁剪透明度低于阈值的片元实现透明,而透明度混合利用混合因子得到半透明效果,但需要关闭深度写入。文章强调渲染顺序的重要性,解释为何透明度混合要关闭深度写入,并介绍Unity的渲染队列和混合命令以优化透明效果。同时,讨论了双面渲染透明效果的实现方法。
摘要由CSDN通过智能技术生成

基本概念

透明是游戏中经常要使用的一种效果。

在实时渲染中要实现透明效果,通常会在渲染模型时控制它的透明通道(Alpha Channel)。

当开启透明混合后,当一个物体被渲染到屏幕上时,每个片元除了颜色值和深度值之外,它还有另一个属性——透明度。

当透明度为1时,表示该像素是完全不透明的,而当其为0时,则表示该像素完全不会显示。

在Unity中,我们通常使用两种方法来实现透明效果:
第一种是使用透明度测试(Alpha Test),这种方法其实无法得到真正的半透明效果;
另一种是透明度混合(Alpha Blending)。

渲染顺序

对于不透明(opaque)物体,不考虑它们的渲染顺序也能得到正确的排序效果,这是由于强大的深度缓冲(depthbuffer,也被称为z-buffer)的存在。

在实时渲染中,深度缓冲是用于解决可见性(visibility)问题的,它可以决定哪个物体的哪些部分会被渲染在前面,而哪些部分会被其他物体遮挡。

它的基本思想是:根据深度缓存中的值来判断该片元距离摄像机的距离,当渲染一个片元时,需要把它的深度值和已经存在于深度缓冲中的值进行比较(如果开启了深度测试),如果它的值距离摄像机更远,那么说明这个片元不应该被渲染到屏幕上(有物体挡住了它);否则,这个片元应该覆盖掉此时颜色缓冲中的像素值,并把它的深度值更新到深度缓冲中(如果开启了深度写入)。

使用深度缓冲,可以让我们不用关心不透明物体的渲染顺序,例如A挡住B,即便我们先渲染A再渲染B也不用担心B会遮盖掉A,因为在进行深度测试时会判断出B距离摄像机更远,也就不会写入到颜色缓冲中。但如果想要实现透明效果,事情就不那么简单了,这是因为,当使用透明度混合时,我们关闭了深度写入(ZWrite)。

透明度测试

它采用一种“霸道极端”的机制,只要一个片元的透明度不满足条件(通常是小于某个阈值),那么它对应的片元就会被舍弃。

被舍弃的片元将不会再进行任何处理,也不会对颜色缓冲产生任何影响;否则,就会按照普通的不透明物体的处理方式来处理它,即进行深度测试、深度写入等。

透明度测试是不需要关闭深度写入的,它和其他不透明物体最大的不同就是它会根据透明度来舍弃一些片元。

虽然简单,但是它产生的效果也很极端,要么完全透明,即看不到,要么完全不透明,就像不透明物体那样

透明度混合

这种方法可以得到真正的半透明效果。

它会使用当前片元的透明度作为混合因子,与已经存储在颜色缓冲中的颜色值进行混合,得到新

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值