为什么要使用glTranslatef?为什么不直接更改渲染词呢

Why use glTranslatef? Why not just change the rendering co-ords?

本文关键字:glTranslatef 为什么不 为什么      更新时间:2023-10-16

我正在用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函数翻译很容易,而其他两个函数在没有函数的情况下更复杂)

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

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

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

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

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

如果您只需要平移,则可以在着色器内部无任何问题地进行平移。通过这种方式,您可以通过统一动态地更改偏移。如果您添加了一个常量偏移并将数据上传到VBO,然后需要再次更改,则需要更新缓冲区,这只是对带宽和内存事务的不必要浪费。