保存/恢复OpenGL ES状态的正确方法

时间:2010-08-18 21:13:45

标签: opengl-es drawing convention

我知道要保存/恢复矩阵状态,您可以使用标准的推/弹操作。我无法找到保存/恢复状态的合适约定,例如使用glLineWidth()或glColor4ub()时。

似乎没有必要,只要你想要绘制任何东西就可以正确设置线宽或颜色,但我可以看到你在自己的绘图函数中的位置示例,调用一些单独的绘图函数来改变在你不知情的情况下你的线宽,然后当你继续绘画时它的出现并不像预期的那样。

要解决这个问题,你可以在调用任何你不知道它的功能之后重置你的线宽,但这看起来不那么优雅,而且我觉得应该有一个解决方案,但我已经错过了不知。

对于我自己的代码,我一直在每个绘图函数的开头做这个:

GLfloat savedLineWidth = 1.0f;
glGetFloatv(GL_LINE_WIDTH, &savedLineWidth);
glLineWidth(lineWidth);

然后在绘图函数结束时恢复状态,如下所示:

glLineWidth(savedLineWidth);

这并不能帮助我,除非我假设每个我不了解内部的绘图功能都很好并且自己恢复状态。

我应该做出这个假设吗?或者我错过了什么?

1 个答案:

答案 0 :(得分:2)

如果这是普通的OpenGL(不是ES变体),那么你可以推送属性,如:

glPushAttrib(GL_LINE_WIDTH);
glLineWidth(2.0f);
... etc ...
glPopAttrib();

唉,在OpenGL ES中,这是不可用的。获取和设置的方法与您将获得的一样好。

尝试减少获取次数,因为这是一个非常耗时的过程。与发送不同,获取不是缓冲的。

也许你的方法应该是不要担心。无论何时想要设置线宽,只需设置它即可。线宽不应该影响太多。

艰难的电话。取决于这些其他绘图功能是什么。你有代码吗?也许你可以看看?