我只是不明白OpenGL的glMatrixMode
是干什么用的。
据我所知,当调用glMatrixMode(GL_MODELVIEW)
时,后面跟着glVertex
、glTranslate
、glRotate
等,即OpenGL命令,将一些对象 * 放置 * 在空间的某个地方。另一方面,如果调用glOrtho
或glFrustum
或gluProjection
(即放置的对象是如何 * 渲染 * 的),它有一个glMatrixMode(GL_PROJECTION)
的先行调用。
我想我到目前为止所写的是一个假设,有人会证明我是错的,但这并不是使用不同 * 矩阵模式 * 的 * 要点 *,因为有不同种类的gl函数:一种是关于放置对象的,另一种是关于如何渲染对象的?
4条答案
按热度按时间insrf1ej1#
这个问题很简单,可以非常简短地回答:
glVertex
中)取决于被称为**“模型视图矩阵”和“投影矩阵”的矩阵的当前状态**;glTranslatef
、glPushMatrix
、glLoadIdentity
、glLoadMatrix
、glOrtho
、gluPerspective
和整个系列影响当前矩阵(其为上述任一个);glMatrixMode
选择受上述命令影响的矩阵(模型视图或投影)。(还有用于纹理坐标的纹理矩阵,但很少使用。)
因此,常见的使用案例是:
ma8fv8wu2#
也可以对投影矩阵使用glRotate和glTranslate。
另外:OpenGL支持纹理和颜色的转换。如果激活此功能,您可以修改对象的纹理坐标,而无需每帧重写纹理坐标(慢)。
如果你想在一个对象上滚动纹理,这是一个非常有用的功能。你要做的就是绘制纹理对象,将矩阵模式设置为GL_TEXTURE,然后调用glTranslate来设置纹理的偏移量。
lfapxunr3#
正如Nils指出的,你对矩阵的了解不仅仅是你提到的。
我想补充几点:
nkoocmlb4#
所有几何坐标都要依次进行多次线性变换。虽然任何线性变换都可以用一个矩阵来表示,但通常您需要考虑一个变换序列并编辑该序列,如果您只有一个矩阵,则只能更改该序列的末端。通过提供多个变换步骤,OpenGL在中间提供了几个位置,您也可以在其中更改变换。
在发射几何体之前调用
glMatrixMode
完全没有效果。在编辑变换矩阵之前调用glMatrixMode
,以确定这些编辑在整个序列中出现的位置。(NB:如果你记得平移和旋转是不可交换的,那么看序列就更有意义了,因为平移改变了旋转的中心。同样,平移和缩放也是不可交换的。)