7

目前,我的管道中有大约 15 个渲染通道。对于每一次通过,我在绘制之前设置正确的设置并在之后重置它们。这些设置包括视口大小、打开或关闭深度测试、混合功能或关闭、模板功能、模板操作等。

我想知道 OpenGL 是否足够聪明,可以忽略设置已经存在的状态的 API 调用。因为否则我会使用很多标志来跟踪状态,并且在渲染传递之前只在实际需要时设置状态。

4

3 回答 3

7

简短的回答:这取决于驱动程序。

OpenGL 本身并没有做很多事情。供应商可以以他们认为合适的任何方式实现标准指定的功能。他们是否通常测试现有状态以避免不必要地停止管道?也许吧,但如果没有阅读供应商的建议或自己衡量性能,就无法确定。

我所看到的建议的共识(没有参考,因为它遍布整个地方)是你应该避免调用带有冗余状态更改的 OpenGL。它不会造成太大的伤害,它可能会带来一些好处。

在您的情况下(在通过之间每帧更改状态几次),它可能不会有太大的不同。

于 2013-06-17T08:55:00.987 回答
2

因为否则我会使用很多标志来跟踪状态,并且在渲染传递之前只在实际需要时设置状态。

请注意,这可能会也可能不会比保持原样更快。正如其他人所说,OpenGL 只是一个 API 规范,将实现留给 GPU 供应商(或 Mesa 等开源社区)。一般来说,您应该期望每次调用都会产生一些结果,但如果您主要关心的是性能,那么真正选择的唯一方法是profiling

这些结果可能因平台而异,甚至因图形驱动程序的版本而异,有时甚至会出现意想不到的情况,例如依靠电池供电。在您进行测量之前,您无法说出应用程序中真正的性能问题是什么。

于 2013-06-17T10:06:34.650 回答
-1

其中很多似乎是标志,设置标志可能比测试和设置它更昂贵。所以问题是OpenGL是否足够愚蠢而不是足够聪明。

其余的我怀疑计算成本,也许设置转换矩阵与实际渲染的工作相比会很重要,因此不值得在库级别进行优化。

于 2013-06-17T08:39:43.250 回答