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

Mat*_*lds 5 c++ opengl sdl

我正在用C++编写一个简单的Pacman游戏,使用OpenGL和SDL.我打算使用这个glTranslatef函数,但是改变绘图函数使用的算法似乎更简单.我想知道,为什么你/你应该使用glTranslatef

这是两者的glTranslatef简单示例,只是简单地改变了合作

glPushMatrix()
glTranslatef(10,0,0)
draw()
glPopMatrix()
Run Code Online (Sandbox Code Playgroud)

要么

//Assuming the draw function took co-ords
draw(x+10 ,y ,z)
Run Code Online (Sandbox Code Playgroud)

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

编辑

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

tho*_*kra 10

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

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

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

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

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

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