为什么要使用glTranslatef?为什么不改变渲染合作?

时间:2013-08-30 17:58:22

标签: c++ opengl sdl

我正在使用OpenGL和SDL在C ++中制作一个简单的Pacman游戏。我打算使用glTranslatef函数,但更改绘图函数使用的co-ords似乎更简单。我想知道,为什么你/你应该使用glTranslatef

以下是glTranslatef和简单更改合作伙伴

的快速示例
glPushMatrix()
glTranslatef(10,0,0)
draw()
glPopMatrix()

//Assuming the draw function took co-ords
draw(x+10 ,y ,z)

我唯一的猜测是它们实际上是相同的,它只是偏好。你能开导我吗?

修改

请注意,我只是在谈论翻译功能。关于缩放和旋转的一切都无关紧要,我只谈翻译。 (这是因为没有glTranslatef函数,翻译很容易,而其他两个函数在没有函数的情况下更复杂)

1 个答案:

答案 0 :(得分:10)

在传统的OpenGL矩阵操作命令中,例如glTranslate,改变当前所选矩阵堆栈顶部的矩阵。

例如,当您选择MODELVIEW作为当前堆栈并调用glTranslate时,当前的modelview矩阵将替换为M_current * M_translation。

您的代码有效地对提交给GL的顶点执行额外的转换,但与向x坐标添加常量偏移相反,可能还有其他转换,如旋转,缩放甚至可能已经编码的一个或多个转换您当前的MODELVIEW矩阵。

所以不,除非您当前的MODELVIEW矩阵不是身份,否则这两者通常不相同。

但是,如果您的唯一目的是翻译您的顶点并且永远不会再次更改位置,则可以添加常量偏移。

如果您只需要翻译,则可以在着色器内完成此操作而不会出现任何问题。这样,您可以通过制服动态地改变偏移。如果你添加一个常量偏移并将数据上传到VBO并需要在之后再次更改它,你需要更新缓冲区,这只是不必要地浪费带宽和内存事务。