Unity半透明特效原理讲解(为什么半透明设置渲染顺序和深度写入这么重要)

这篇具有很好参考价值的文章主要介绍了Unity半透明特效原理讲解(为什么半透明设置渲染顺序和深度写入这么重要)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

写在前面

最近要实现一个透明的特效,所以更仔细的去学了一下。但是网上更多的是用文字讲解,实验做的相对较少,因此我在这里会更多的附上实验效果展示和结论。若有理解错误的地方,欢迎讨论。

实验场景

摄像头看向两个Cube,红Cube在前,蓝Cube在后
Unity半透明特效原理讲解(为什么半透明设置渲染顺序和深度写入这么重要)

实验1:红(不透明)+蓝(不透明)+默认渲染顺序(先渲染红Cube)

效果:
Unity半透明特效原理讲解(为什么半透明设置渲染顺序和深度写入这么重要)
解析: 红蓝Cube使用相同的Shader,只是颜色不一样。可以看到红色挡住了颜色。这很好理解。因为Unity对于不透明物体默认从离摄像机近的地方开始渲染。那红Cube会先进行深度测试,发现深度缓冲区里面是空的,所以将红Cube的深度写入深度缓冲区,并将自己的颜色Red写入颜色缓冲区。之后蓝Cube深度测试,发现自己的深度值比深度缓冲区里的蓝Cube值要大,所以没通过深度测试,所以不会将自己的深度值写入深度缓冲区中覆盖掉以前红Cube的深度缓冲区,也不将自己的颜色Blue写入颜色缓冲区。
结论:
1、Unity对于不透明物体默认渲染顺序是从离摄像机近的地方开始渲染。
2、通过深度测试,进行深度写入时,颜色写入颜色缓冲区也会同时进行。

Shader代码:

Shader "My/Blue"
{
	Properties
	{
		_Color("Color", Color) = (0,0,1,1)
	}
	SubShader
	{
		Tags { "Queue"="Geometry" }
	    
		LOD 100
        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            fixed4 _Color; 
            struct appdata
            {
                float4 vertex : POSITION;
            };

            struct v2f
            {
                float4 vertex : SV_POSITION;
            };
            
            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                return fixed4(_Color.r,_Color.g,_Color.b,_Color.a);
            }
            ENDCG
        }
	}
}

实验2:红(不透明)+蓝(不透明+优先渲染)

效果:
Unity半透明特效原理讲解(为什么半透明设置渲染顺序和深度写入这么重要)
解析:
把红色Cube的渲染队列值调到2001大于蓝色Cube的渲染队列值。从而使得蓝色Cube优先渲染。但是结果并没有发生改变。这是因为先渲染蓝色时,蓝色的深度值被写入深度缓冲区,再渲染红色时,红色深度值比红色小,因此写入深度缓冲区。
Unity半透明特效原理讲解(为什么半透明设置渲染顺序和深度写入这么重要)

Unity半透明特效原理讲解(为什么半透明设置渲染顺序和深度写入这么重要)

结论:
1、改变渲染队列值能改变Unity对物体的渲染顺序。
2、对于不透明物体来说,因为深度测试的存在,所以不用关心渲染顺序。

实验3:红(透明+关闭深度写入)+蓝(不透明)+默认渲染顺序(先渲染蓝Cube)

效果:
Unity半透明特效原理讲解(为什么半透明设置渲染顺序和深度写入这么重要)
解析:
我们仅在红Cube的Shader中加入透明度混合代码、把红色Cube的渲染队列改为3000、关闭深度写入,并且把红Cube的透明度改为150。此时可以看到红色Cube呈现透明效果。原因也很简单。因为先渲染蓝色,所以当红色Cube进行深度测试通过时本应该把深度值写入深度缓冲区但是由于我们关闭了深度写入,所以深度值还是蓝色Cube的深度值。但是混合的颜色依然写入颜色缓冲区。
在本场景Blend SrcAlpha OneMinusSrcAlpha表示红色红色透明度+蓝色(1-红色透明度)

//红CubeShaer加
Tags {"Queue"="Transparent" }
Blend SrcAlpha OneMinusSrcAlpha

Unity半透明特效原理讲解(为什么半透明设置渲染顺序和深度写入这么重要)
结论:
1、关闭深度写入,只是代表如果深度测试通过时不会将深度值写入深度缓冲,但是颜色写入依然会进行。

实验4:红(透明+关闭深度写入+优先渲染)+蓝(不透明)

效果:
Unity半透明特效原理讲解(为什么半透明设置渲染顺序和深度写入这么重要)
解析:
我们将蓝色Cube的渲染队列值调到3001大于红色的300。因此先渲染红色Cube,但是由于红色Cube关闭了深度写入,所以深度值不会写入深度缓冲区,所以深度缓冲区依然为空,但是颜色依然会写入颜色缓冲区。然后渲染蓝Cube时,发现深度缓冲区为空,这时就会误以为蓝Cube是第一个渲染的,所以将蓝Cube深度值写入深度缓冲区,颜色值写入颜色缓冲区,从而导致了蓝Cube在红Cube前的效果。
Unity半透明特效原理讲解(为什么半透明设置渲染顺序和深度写入这么重要)
结论:
1、对于半透明物体来说,渲染顺序是相当重要的,不同的渲染顺序会出现不同的效果。

实验5:红(透明+开启深度写入)+蓝(不透明)+默认渲染顺序(先渲染蓝Cube)

效果:
Unity半透明特效原理讲解(为什么半透明设置渲染顺序和深度写入这么重要)
解析:
将蓝Cube渲染队列值调回2000,使得蓝Cube优先渲染,但开启红Shader的深度写入。所以在渲染红Cube时,深度测试通过后会将红色Cube的深度值写入深度缓冲区,混合颜色会写入颜色缓冲区。
Unity半透明特效原理讲解(为什么半透明设置渲染顺序和深度写入这么重要)
结论:
1、显示结果和实验3红色Cube关闭深度写入是一样的,有人会觉得,开不开启深度写入好像效果都一样,只是最终存到深度缓冲区里面的值不一样罢了,实验3中深度缓冲区离得值是蓝Cube得深度值,而实验5深度缓冲区里得值是红Cube的值。那为什么还要关闭红Shader的深度写入呢?这不多此一举吗?这是因为此时还没考虑当蓝色Cube也是透明的情况,请看实验6、7

实验5.5:红(透明+开启深度写入+优先渲染)+蓝(不透明)

效果:
Unity半透明特效原理讲解(为什么半透明设置渲染顺序和深度写入这么重要)
解析: 调大蓝色的渲染队列值(3001)使其大于红色的渲染队列值(3000),让红色先渲染。红色深度值和颜色被写入。然后渲染蓝色,因为蓝色在后面,深度值小于红色所以不写入深度缓冲区,因此即便红色半透明,也看不到蓝色。

实验6:红(透明+开启深度写入)+蓝(透明+开启深度写入)+默认渲染顺序(先渲染蓝Cube)

效果:
Unity半透明特效原理讲解(为什么半透明设置渲染顺序和深度写入这么重要)
解析:
把蓝色也变为透明,可以看到红蓝重叠的地方,完全看不到红色。为什么呢?见https://blog.csdn.net/a1047120490/article/details/106744930/
写得很详细,解释了为什么。
大概意思是。开启ZWrite的,可以看到重合部分红色Cube没有被混合渲染出来。
因为unity渲染顺序是按照物体中心点排序的,也就是objectlevel。所以重合部分的像素的深度缓存会先存入蓝色cube在重合部分的深度。然后渲染的红色Cube时,由于重叠部分红色Cube的像素深度>蓝色Cube(因为重叠部分红色被蓝色包裹),因此根本没办法通过深度测试,自然没办法深度写入,所以只显示的是蓝Cube的颜色。
也就是说导致问题的原因是渲染顺序是按照物体中心点到摄像机距离排序的(objcet level),而像素深度测试是按被渲染物体的那个渲染点到像素的距离决定的(piexel level)从而导致问题的发送。所以要解决这个问题可以将渲染顺序改为piexel level

结论:
当两个透明物体发生重叠时如果开启深度写入,那么重叠的部分显示会出错。

实验7:红(透明+关闭深度写入)+蓝(透明+关闭深度写入)+默认渲染顺序(先渲染蓝Cube)

Unity半透明特效原理讲解(为什么半透明设置渲染顺序和深度写入这么重要)
解析:
可以看到红蓝重叠的地方,得出了透明的效果,但感觉红色是在蓝色前面的。为什么呢?同样见
https://blog.csdn.net/a1047120490/article/details/106744930/
大概意思是红Cube和蓝Cube重合的地方,应该先渲染红Cube再渲染蓝Cube,因为重合的地方是蓝Cube包裹了红Cube,而实际渲染顺序为先蓝Cube再红Cube,所以看起来有点怪。
结论:
当两个透明物体发生重叠时如果不开启深度写入,那么重叠的部分显示照样会出错,但总比开启深度写入强。

总结

1、对于不透明物体的,因为深度缓冲区的原因,渲染顺序不太重要(实验1、2)。
2、对于透明物体,渲染顺序会直接影响渲染结果,所以要设置渲染队列 Tags { "Queue"="Transparent" }(实验3、4)
3、对于透明物体,如果开启深度写入,当两个透明物体重合时,会出现渲染错误,如果关闭深度写入,也会出现渲染错误,但比开启时错误要少。所以还是关闭深度写入的好。
4、因此对于半透明物体的默认写法为设置渲染队列为"Queue"="Transparent",设置透明混合Blend SrcAlpha OneMinusSrcAlpha,关闭深度写入ZWrite Off

//设置渲染队列和渲染类型
Tags {"Queue"="Transparent"  "RenderType"="Transparent" }
//设置透明混合
Blend SrcAlpha OneMinusSrcAlpha
//关闭深度写入
ZWrite Off

5、Unity在进行渲染时一般会对物体进行排序,再渲染,渲染顺序为:
(1)先渲染所以不透明物体("Queue"="Geometry"的物体),从到相机的距离,由远到近渲染,并且开启深度测试和深度写入。
(2)再渲染半透明物体("Queue"="Transparent"的物体),从到相机的距离,由远到近渲染,并且开启深度测试但关闭深度写入。
(3)但由于Unity对物体距离相机距离排序是基于object level的(基于物体中心的排序),所以当两个透明物体出现重合时,会出现渲染的错误,这是应该以像素为单位排序渲染(用顺序无关透明(order independent transparency, OIT)技术)。

写在后面

今天2023/02/21是出考研成绩的日子,虽然博主已经走过了考研的独木桥,但回望过去考研的经历还是不禁感叹,考研这条路注定是孤独的,注定是几家欢喜几家愁。愿,星光不问赶路人,时光不负有心人。
Unity半透明特效原理讲解(为什么半透明设置渲染顺序和深度写入这么重要)文章来源地址https://www.toymoban.com/news/detail-462035.html

到了这里,关于Unity半透明特效原理讲解(为什么半透明设置渲染顺序和深度写入这么重要)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • spark中为什么要设置宽窄依赖

    宽依赖指的是两个或多个任务或数据之间具有较强的依赖关系。也就是说,在执行某个任务之前,需要先完成其他几个任务。宽依赖通常会导致任务串行执行,因为一个任务的开始必须等到其它任务的结束。这种关系会增加系统的延迟和执行时间。例如,如果任务A依赖于任务

    2024年02月12日
    浏览(32)
  • 什么是IP白名单?为什么要设置IP白名单?

    在互联网的世界里,IP地址是每个设备与网络进行通信的关键标识。然而,并不是所有的IP地址都可以无限制地访问所有网络资源。为了保障网络安全和资源管理,很多网站和服务会设置IP白名单。本文将详细介绍IP白名单的定义、作用以及为什么要设置IP白名单。 1、IP白名单

    2024年04月16日
    浏览(37)
  • 【Unity细节】Unity中为什么镜头下会抖动

    👨‍💻个人主页 :@元宇宙-秩沅 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 秩沅 原创 😶‍🌫️收录于专栏 :unity细节和bug 😶‍🌫️优质专栏 ⭐【软件设计师高频考点暴击】 Unity中为什么镜头会抖动 相机相关的代码和移动相关的代码未在同一生命函数内,然而

    2024年02月03日
    浏览(39)
  • 【Unity细节】为什么加载精灵图集直接导致Unity引擎崩溃

    👨‍💻个人主页 :@元宇宙-秩沅 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 秩沅 原创 😶‍🌫️收录于专栏 :unity细节和bug 😶‍🌫️优质专栏 ⭐【软件设计师高频考点暴击】 点击运行,Unity直接崩溃退出 在加载打包后的图集时,可能图集里面没有相应的资源,

    2024年02月05日
    浏览(37)
  • 机器学习强基计划10-1:为什么需要集成学习?核心原理是什么?

    机器学习强基计划聚焦深度和广度,加深对机器学习模型的理解与应用。“深”在详细推导算法模型背后的数学原理;“广”在分析多个机器学习模型:决策树、支持向量机、贝叶斯与马尔科夫决策、强化学习等。强基计划实现从理论到实践的全面覆盖,由本人亲自从底层编

    2024年02月06日
    浏览(33)
  • 压缩算法的原理丨基因型vcf文件为什么压缩后发生了什么?

    最近碰到一个神奇的现象,一份大小为 16GB 的 xx.vcf.gz 文件,解压之后体积变为 600GB 的 vcf 文件,为什么一份文件经过压缩后体积缩小了这么多? 压缩 这个词联想到压缩机,就是把空气进行物理加压,减小占用的体积,这种方法利用的是单个分子之间的可变间隙,像挤海绵一

    2024年02月15日
    浏览(29)
  • 网通光纤路由器怎么设置为什么提示帐户密码错误

    最近小编因为工作原因又要搬家,新房东家是网通光纤宽带,是光纤进楼后先进的光纤接受器,看外观像是大的交换机。然后每个房间一条网线可以直接插入电脑,找房东开个帐户然后买张冲值卡,下载一个新的连接客户端,输入帐户密码就可以上网了.家里两台电脑需要上网

    2024年02月06日
    浏览(34)
  • 【Unity地编细节】为什么Unity笔刷在地形上面刷不出来

    👨‍💻个人主页 :@元宇宙-秩沅 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 秩沅 原创 😶‍🌫️收录于专栏 :unity细节和bug 😶‍🌫️优质专栏 ⭐【软件设计师高频考点暴击】 笔刷刷地形刷不了 未选择 RasiseOr Lower Terrain Raise or Lower Terrain:提升或降低高度地形。选

    2024年02月03日
    浏览(37)
  • 录屏为什么没有声音?两个步骤检测你的电脑设置

    很多小伙伴在录制完电脑屏幕后,会发现一个问题:录制的电脑屏幕文件只有画面,没有声音。 录屏为什么没有声音? 怎样才能录制有声音的视频?导致录屏没有声音的原因有很多。 下面小编就教您两个步骤检测您的电脑设置,然后手把手教您如何录制带声音的录屏文件,

    2024年02月11日
    浏览(40)
  • 【unity细节】为什么发射炮弹实例化出来了却无法移动

    👨‍💻个人主页 :@元宇宙-秩沅 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 秩沅 原创 收录于专栏 :unity细节和bug 为什么发射炮弹实例化出来了却无法移动 ? 1. 如果全部勾选上那么该预制炮弹无法进行移动 2.炮弹的碰撞网格是否和炮管的碰撞网格 相重合导致,摩

    2024年02月14日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包