2

我正在使用 gDEBugger 来尝试提高我的 openGL 代码的性能(目前它非常糟糕,我什至不会告诉你它的 fps 速率)。我正在逐步完成教程(使用调试器查找 openGL 错误等),现在我正在识别冗余状态更改。我有点不确定更改代码以避免它们是否真的是一个好主意。

例如:

  • 我的代码通过调用glClearAccum(0 , 0 , 0 , 0);and进行“干净初始化” glClearColor(0.0, 0.0, 0.0, 0.0);。这些是可以理解的多余的,但我可以在所有情况下依赖它吗?如果某些 openGL 实现不能保证这个初始状态,那么进行调用会更安全,即使它们在大多数情况下是多余的。
  • glDrawBuffer(GL_BACK);第一次绘制场景时同样的问题。
  • glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL)也被报道是多余的。我意识到我用相同的参数反复调用它;这是因为调用是在 和 之间glEnable(GL_TEXTURE_2D);进行的glDisable(GL_TEXTURE_2D);,并且在纹理调用完成时仅短暂启用了纹理。永久启用纹理会影响性能吗?如果我坚持暂时启用纹理,是否可以glTextEnvf在初始化期间只调用一次,还是会因为此时禁用纹理而失败?还是这取决于openGL的实现?
4

2 回答 2

1

对于初始化代码,如果您查看每个特定函数的手册页,它将告诉您默认值是什么,这是由规范保证的。也就是说,初始化代码根本不重要,因为它在开始时只运行一次,并且您进行的每次调用都可能有一个微秒的延迟。在初始化期间不必担心这些事情。

对于 glTexEnvf,禁用纹理时不会重置状态。glEnable(GL_TEXTURE_2D) 对任何其他纹理函数都没有影响,它只是确定在绘制调用期间是否不对纹理进行采样。您不必启用纹理来设置纹理参数。

例如,以下代码是有效的:

//textures disabled
glTexEnvf(some_texture_state);

for(i=0;i<10;i++){
   glEnable(GL_TEXTURE_2D)
   //draw some stuff with textures and "some_texture_state"
   glDisable(GL_TEXTURE_2D)
   //draw some stuff without texturing
}
于 2012-04-29T19:50:21.513 回答
0

glClearAccum(0 , 0 , 0 , 0);并且glClearColor(0.0, 0.0, 0.0, 0.0);当您每帧绘制整个屏幕时(您可能会这样做)是多余的,而且它们很重。清除帧缓冲区没有意义,只需在最后一帧上绘制即可。

glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);设置一个标志,应该一直工作。不过应该不贵。

于 2012-04-29T19:51:35.403 回答