Q: 为什么透明度混合需要关闭深度写入?
A: 因为开启深度写入后, 没有通过深度测试的像素会不渲染. 这样透明便失去了意义, 透明要求被透明物体挡住的物体也能被渲染才有意义.
Q: 到底是物体还是像素?
A: 用shader粒度来定义物体, 一个shader对应一个物体, 要渲染出一个场景, 需要渲染多个物体, 包含多个shader. 跨shader时说物体, 同一shader内说像素.
Q: 到底时像素还是片元?
A: 像素与片元一一对应, 片元是携带了rgba信息之外还额外携带了顶点法线,纹理坐标uv的像素,屏幕坐标,深度信息. 片元是在三角形遍历中被三角形网格所覆盖的像素.
Q: 一个shader关闭深度写入后, 物体内片元的渲染顺序如何确定? 多个shander, 多个物体之间的渲染顺序如何确定?
A: 一个shader对应的物体片元渲染顺序随机, 也可由深度信息先排序再顺序渲染, 多个物体之间也一样. 和关不关闭深度写入无关.
Q: 既然可由深度信息排序决定渲染顺序, 那么Unity制定的RenderQueue是做什么的?
A:
2排序之后, 为了高度利用深度测试提高性能, 对不透明物体, 按从顶部向底部渲染, 但对透明物体, 则要从底部到顶部.
3之所以使用RenderQueue就是因为要高度利用深度测试的话, 不透明物体与透明物体的渲染顺序不同, 故用RenderQueue对它们分类分别进行排序.
Q: 为物体排序能提高渲染性能, 也是透明物体混合渲染所必须的行为, 但排序也会带来问题, 比如?
A: 对物体排序就会产生透明物体的重叠问题, 因为排序是对物体排序而不是对片元排序, 因为对片元排序代价太大, 不仅个数多, 而且要频繁切换所用shader. 这样实质是对物体中心点排序, 两个物体相互重叠就会出现渲染错误. 不透明物体根据深度测试可避免此问题, 但透明物体要关闭深度写入, 所以无法避免此问题. 解决方式只能是尽量对透明物体使用更小的切分, 尽量切分出凸面体的模型. 目前还没有很完美的解决方法.