按照我们的常规理解,渲染顺序应该是:
1.不透明物体按照相机空间进行Z轴排序,从前往后排,先渲染前面再渲染后面,避免造成过多的OverDraw
2.绘制天空盒,天空盒在要不透明物体之后渲染,避免造成OverDraw
3.绘制透明物体,透明物体按照相机空间进行Z轴排序,从后往前排,先渲染最后面的,这样才能正确的Blend颜色
实际上,Unity的不透明物体排序可能会稍微复杂些,可能要考虑材质合批,模板测试影响,所以不一定是按Z轴从前往后渲染。
SRP支持我们自定义渲染管线的物体排序。
控制 Unity 的渲染顺序 - 为什么以及如何 |Toca Boca Tech 博客 --- Controlling Unity's rendering order - why and how | Toca Boca Tech Blog
Unity :排序标准 SortingCriteria --- Unity - Scripting API: SortingCriteria
Unity :内置渲染管线中的渲染顺序 --- Unity - Manual: Rendering order in the Built-in Render Pipeline
Unity :不透明排序模式 OpaqueSortMode --- Unity - Scripting API: OpaqueSortMode 可以手动指定相机渲染不透明物体时的排序方式,默认情况下,不透明对象被分组在粗略的从前到后的存储桶中,在 GPU 上这样做是有益的。在某些 GPU 中,执行这种基于距离的排序并没有真正的帮助(最值得注意的是 PowerVR/Apple GPU),因此在这些 GPU 上,默认情况下不会完成基于距离的排序。
TODO:待研究
因我发现Unity有些地方很奇怪
A.4.3.1f1旧版本,模板测试的开启似乎会影响物体的排序?按道理来说,模板测试应该受先后渲染顺序影响,比如物体A先绘制,写入模板缓冲区,物体B后绘制,读取模板缓冲区,逻辑正常。
但如果反过来,物体B先绘制,此时读取的模板缓冲区就是空的,可能会导致渲染跟我们预期不一样,所以需要手动去Shader里设置渲染顺序,让A先渲染。
但奇怪的是,我并不用手动设置,在4.3.1f1中,不管我怎么摆放它们,模板缓冲区总是能正确被读取。难道旧版在渲染时,会自动优先渲染有写入模板缓冲区的对象?
B.这个问题在Unity6里似乎就正常了点,物体的不同摆放,会影响渲染顺序,从而影响模板缓冲区的读取是否正确。但Unity6里也有个问题,比如有3个物体ABC,按照从前到后摆放,其中B写缓冲区,AC读取。
按照理解,应该是先渲染A再B再C,所以A应该读取不到缓冲区的内容,C能读到。但实际上,一旦我给B加上写模板缓冲的Shader后,它们的渲染顺序就不再是从前往后了,B可能会变到最后。难道是跟材质批次有关?