渲染顺序

一个不透明或半透明物体的显示状态应该怎样确定?

一般在画画的时候:
首先将场景的多边形根据深度进行排序,然后按照顺序进行绘制
但是如果有半透明的东西呢?他们之间相互混合,也十分复杂

为了解决这些问题,计算机咋整呢?

深度缓冲区(Depth Buffer)
记录像素的深度信息,存储像素到摄像机的深度
每一帧开始前,深度缓冲区都会被清空。
当需要渲染新的像素时,像素的深度会预先被计算出来,比较这个像素的深度值与缓冲区中的值
通过算法判断是否要通过该像素,或需要在深度缓冲区中写入该像素的深度

在场景没有透明物体的情况下,我们可以按照缓冲区比较,无需对场景中的物体进行排序,也避免了重复绘制
既能解决重叠的问题,又可以带来性能的提升


但是有透明物体咋整呢?
如果透明物体A在不透明物体B前面,A离摄像机距离一定B更近
如果A写入了深度值,B就不会被绘制,自然也看不到半透明效果

引进了渲染队列的概念。
啥玩意是渲染队列?
也是按深度缓冲,但将不透明与半透明的物体分开
先渲染不透明的物体,对比起深度值,并将其深度值写入缓冲
然后再渲染半透明物体,只对比深度值,不写入缓冲(半透明物体之间使用深度值)


Unity中的预定义渲染队列(队列索引号越小,越早被渲染)

渲染队列-----------------渲染队列索引
Background------------------1000 (skybox已经不在这里了)
Geometry---------------------2000
AlphaTest---------------------2450
Transparent------------------3000
Overlay------------------------4000

Shader "my/test"
{
  SubShader
  {
    Tags { "Queue" = "Geometry"}
  }
}

使用渲染队列后也会有一些问题
如果相互穿插,就没有办法得到正确的排序,进而得到错误的颜色值

解决方法:
1.拆分或优化模型的形状,降低穿插
2.调整混合参数,看起来不那么明显
3.预先深度Pass(Pre Depth Pass)方法(有额外drawcall)

最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容