透明物体的渲染

透明物体的渲染涉及到Alpha Test和Alpha Blend,通常关闭ZWrite以避免深度冲突。正确的渲染顺序是先渲染不透明物体,再渲染半透明物体,确保深度缓冲正常工作。对于半透明物体之间的渲染,应按照由远及近的顺序进行。开启ZWrite的透明效果方法虽然能解决某些问题,但会增加性能开销。双向透明渲染通过前后两遍渲染,分别剔除物体的正面和背面,实现透明效果,同样要求正确排序。
摘要由CSDN通过智能技术生成

概述

一般来说,我们使用Alpha Test(透明度测试)或者Alpha Blend(透明度混合)来实现透明效果,其中Alpha Blend(之后简称)Blend可以实现真正的半透明效果。

无论哪种实现方式,我们都需要关闭透明物体的深度写入(禁止ZWrite)。

为什么要关闭透明物体的深度写入?

设想一种情况,假设半透明物体A在不透明物体B的前面。

如果开启了深度写入,那么由于A在B的前面,ZBuffer中存储的肯定是A的Z值,那么B就无法通过ZTest,导致A的颜色会覆盖掉B的颜色。这样最终呈现的效果就是半透明物体A挡住了不透明物体B,这显然不是我们需要的结果。

所以,我们必须关闭透明物体的深度写入,不过这样做实际上破坏了深度缓冲的工作机制,这带来了很大的副作用,为了让深度缓冲机制正常工作,我们就必须严格的控制物体的渲染顺序。

半透明物体和透明物体的渲染顺序

假设半透明物体A和不透明物体B,A仍然在B的前面。

  • 先渲染半透明物体A再渲染不透明物体B :

    • (1) 渲染A,ZBuffer为空,通过ZTest,由于关闭了透明物体的ZWrite,所以A的Z值不会写入ZBuffer
    • (2) 渲染B,实际上此时ZBuffer还是初始值,B通过ZTest之后直接写入ZWrite,导致B的颜色覆盖掉A。
  • 先渲染不透明物体B再渲染透明物体A

    • (1) 渲染B,ZBuffer为空,通过ZTest,B的Z值写入ZBuffer。
    • (2) 渲染A,由于A是在B的前面,所以A会通过ZTest(但不写入ZWrite),之后根据设置好的Blend公式做出混合操作,实现半透明效果。

结论是,如果半透明物体和不透明物体共存,那么首先开启ZWrire,渲染不透明物体。再关闭ZWrite,渲染半透明物体。

半透明物体和半透明物体的渲染顺序

假设半透明物体A和半透明物体B, A在B的前面。

  • 先渲染A再渲染B :

    • (1) 渲染A,ZBuffer为空,通过ZTest,将A写入Framebuffer(颜色缓冲不是ZBuffer)
    • (2) 渲染B,ZBuffer仍然为空,通过ZTest,将B和A颜色混合。如果使用SrcAlpha和OneMinusSrcAlpha这样的公式,会让B的颜色重于A,造成了B在A前面的视觉效果。
  • 先渲染B再渲染A :

    • (1) 渲染B,ZBuffer为空,通过ZTest,将B写入Framebuffer(颜色缓冲不是ZBuffer)
    • (2) 渲染A,ZBuffer仍然为空,通过ZTest,将B和A颜色混合。如果使用SrcAlpha和OneMinusSrcAlpha这样的公式,会让A的颜色重于B
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值