5

我正在使用 OpenGL 和 SDL 用 C++ 制作一个简单的 Pacman 游戏。我打算使用该glTranslatef功能,但只是更改绘图功能使用的坐标似乎更简单。我想知道,你为什么/应该使用glTranslatef

这是一个简单的例子,glTranslatef简单地改变坐标

glPushMatrix()
glTranslatef(10,0,0)
draw()
glPopMatrix()

或者

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

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

编辑

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

4

1 回答 1

10

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

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

您的代码有效地对提交给 GL 的顶点执行了额外的转换,但是,与向 x 坐标添加恒定偏移相比,可能会有额外的转换,如旋转、缩放,甚至可能已经在您当前的 MODELVIEW 中编码的一个或多个转换矩阵。

所以不,除非您当前的 MODELVIEW 矩阵不是恒等式,否则两者通常不等价。

但是,如果您的唯一目的是平移顶点并且不再更改位置,则可以添加恒定偏移量。

如果您只需要翻译,您可以在着色器中毫无问题地完成。这样,您可以通过制服动态更改偏移量。如果您添加一个恒定偏移量并将您的数据上传到 VBO 并且之后需要再次更改它,您将需要更新缓冲区,这只是对带宽和内存事务的不必要浪费。

于 2013-08-30T18:26:07.060 回答