在 OpenGL 中避免过度绘制与批渲染冲突时我该怎么办?
What can I do when avoiding overdrawing conflicted with batch rendering in OpenGL?
比如说,我有一些渲染单元按照与相机顺序的距离排序。
比如ru0, ru1, ru2, ru3, ru4, ru5...
。这样做的目的是通过z深度测试避免透支。
但是,在批量渲染视图中,这是一种浪费。
假设,ru1, ru3, ru5
具有相同的渲染状态(相同的opengl状态和相同的着色器程序),因此它们应该被批处理并一次性渲染。
但是,这不是避免透支要我做的。
所以,我的问题是,这是一个基于特定场景的问题(比如在某些情况下,透支的消耗时间不超过opengl状态更改的消耗时间)还是有其他方法可以解决这个问题?
注意,我所有的渲染单元都是不透明的,所以我在这里没有考虑透明单元。
现代硬件很可能实现"Early z-test",即在片段(像素)着色器运行之前执行深度测试。或者,它可以手动实现。
因此,除非您有透明度问题,否则按州排序可能更有利。在后一种情况下,您可能需要查看 "Order-independent transparency"。
无论如何,不要相信任何人。在优化任何东西之前测量(配置文件)并进行比较。
比如说,我有一些渲染单元按照与相机顺序的距离排序。
比如ru0, ru1, ru2, ru3, ru4, ru5...
。这样做的目的是通过z深度测试避免透支。
但是,在批量渲染视图中,这是一种浪费。
假设,ru1, ru3, ru5
具有相同的渲染状态(相同的opengl状态和相同的着色器程序),因此它们应该被批处理并一次性渲染。
但是,这不是避免透支要我做的。
所以,我的问题是,这是一个基于特定场景的问题(比如在某些情况下,透支的消耗时间不超过opengl状态更改的消耗时间)还是有其他方法可以解决这个问题?
注意,我所有的渲染单元都是不透明的,所以我在这里没有考虑透明单元。
现代硬件很可能实现"Early z-test",即在片段(像素)着色器运行之前执行深度测试。或者,它可以手动实现。
因此,除非您有透明度问题,否则按州排序可能更有利。在后一种情况下,您可能需要查看 "Order-independent transparency"。
无论如何,不要相信任何人。在优化任何东西之前测量(配置文件)并进行比较。