自我介绍

广东双非一本的大三小白,计科专业,想在制作毕设前夯实基础,毕设做出一款属于自己的游戏!

透明效果

实现透明效果,就要控制透明通道

unity中会有两种方法实现透明效果 1. 透明度测试 2. 透明度混合

unity里面,倘若场景中包含很多模型时,我们需要考虑他们的渲染顺序来得到正确的排序效果,这就需要 - 深度缓冲(z-buffer):根据深度缓存中的值来判断该片元距离摄像机的距离 - 倘若A挡住B,我们先渲染A,在渲染B时因为深度测试的时候会判断出B离摄像机更远,就不会写入到颜色缓冲中了

但是!

要实现透明度混合时,我们一定要关闭深度写入

unity shader的渲染顺序

解决渲染顺序的问题,unity提出了 渲染队列

我们可以用SubShader的Queue标签来决定我们的模型将归于哪个渲染队列,索引号越小表示越早被渲染


透明度测试

主要是提供一个新的float变量与主纹理的透明通道值(r)进行比较 来控制需要过滤掉的片元是否显示



Shader



效果




unity玻璃用透明贴图 unity3d透明材质怎么贴_半透明效果


可以看到透明效果非常极端

透明度混合

其实代码跟上面的都差不多,只是去掉了透明度测试的代码,设置该片元着色器返回值中的透明通道,但是在设置之前,必须进行相应的设置打开blend命令打开混合,不然修改透明通道中的值(r)并无任何效果


Shader


unity玻璃用透明贴图 unity3d透明材质怎么贴_unity透明通道加颜色_02


这么一看好像实现了透明度混合了耶!实则不然,我们换一个更加复杂的模型


unity玻璃用透明贴图 unity3d透明材质怎么贴_unity玻璃用透明贴图_03


当模型本身有复杂的遮挡关系就会因为排序错误而产生错误的透明效果 - 这是因为关闭了深度写入,无法对模型进行像素级别的深度排序

优化(开启深度写入的半透明效果)

先看效果,这才是正确的半透明嘛!


unity玻璃用透明贴图 unity3d透明材质怎么贴_unity透明通道加颜色_04


实现原理: - 开启两个pass来渲染模型: - 第一个pass开启深度写入,但不输出颜色,把模型的深度值写入深度缓冲中 - 第二个pass进行正常的透明度混合 - 因为第一个pass已经得到了逐像素的正确的深度信息,所以这个pass可以按照像素级别的深度排序结果进行透明渲染


Shader