为啥使用 glTranslatef?为啥不直接更改渲染坐标?

Posted

技术标签:

【中文标题】为啥使用 glTranslatef?为啥不直接更改渲染坐标?【英文标题】:Why use glTranslatef? Why not just change the rendering co-ords?为什么使用 glTranslatef?为什么不直接更改渲染坐标? 【发布时间】:2013-08-30 17:58:21 【问题描述】:

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

这是glTranslatef 和简单更改坐标的简单示例

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

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

我唯一的猜测是它们实际上是相同的,这只是偏好。能给我解惑吗?

编辑

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

【问题讨论】:

您是否知道调用 glTranslate、glRotate 和 glScale 会改变 maxtrix 堆栈,而只是向某个坐标添加偏移量不会? 是的,但我没有想到这一点。所以您指出,通过更改当前矩阵,您可以移动/旋转/缩放该矩阵中绘制的所有内容,对吗? 您绘制的所有内容都乘以madelview 矩阵,因此在移动/旋转/缩放调用之后,绘制的所有内容都会受到这些转换的影响。你可以看看这个:glprogramming.com/red/chapter03.html#name2 没错,这将简化移动/旋转/缩放大量对象。感谢您指出这一点。 【参考方案1】:

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

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

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

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

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

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

【讨论】:

以上是关于为啥使用 glTranslatef?为啥不直接更改渲染坐标?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 React Router 更改 URL 但不更改视图

为啥我不能更改已定义元素的类名

为啥临时变量需要更改数组元素以及为啥需要在最后取消设置?

当我在选择上使用向上或向下箭头时,为啥 jquery 更改事件不触发?

无法更改 label.text 并且不知道为啥

为啥更改 ItemsSource 时 DataGrid 不更新?