目前我的管道中有大约15个渲染过程。对于每次传递,我在绘制之前设置正确的设置,然后重置它们。这些设置包括视口大小,打开或关闭深度测试,混合功能或关闭,模板功能,模板操作等。
我想知道OpenGL是否足够聪明,可以忽略设置已存在状态的API调用。因为否则我会用很多标志跟踪状态,并且在渲染过程之前只设置状态,如果实际需要的话。
答案 0 :(得分:7)
简短回答:这取决于司机。
OpenGL本身并没有做太多的事情。供应商可以按照他们认为合适的方式实现标准规定的功能。他们通常是否测试现有状态以避免不必要地拖延管道?也许,但缺乏阅读供应商的建议或自己衡量绩效,没有办法确定。
我所看到的建议的共识(没有参考,因为它遍布各处),是你应该避免使用冗余状态变化调用OpenGL。它不会造成太大的伤害,它可能会有所帮助。
在你的情况下(在传球之间每帧改变状态几次),它可能没有太大的区别。
答案 1 :(得分:2)
因为否则我会用很多旗子跟踪状态 并且在渲染过程之前仅设置状态(如果它实际上是) 必要的。
请注意,这可能会或可能不会比保持原样更快。正如其他人所说,OpenGL只是一个API规范,将实现留给GPU供应商(或Mesa等开源社区)。一般来说,你应该期望每次通话产生一些结果,但如果你的主要关注点是表现,那么真正选择的唯一方法是分析。
这些结果可能因平台而异,甚至可能因图形驱动程序的版本而异,有时也会出现像电池电源那样无法预料的事情。在测量之前,您无法说出应用程序中存在真正的性能问题。
答案 2 :(得分:-1)
其中很多似乎是标志,设置标志可能比测试和设置标志更昂贵。所以问题是OpenGL是否足够愚蠢而不是足够聪明。
对于其他人我怀疑计算成本,或许设置转换矩阵与实际渲染工作相比是否显着,因此不值得在图书馆级别进行优化。