joe*_*ish 5 c++ opengl graphics
我开始在OpenGL上做一些工作,我看到很多调用glMatrixMode
函数的例子.
根据我的收集,将其设置为GL_MODELVIEW或GL_PROJECTION(等)将激活该特定转换矩阵,并且对矩阵转换函数(glTranslatef,glPushMatrix,glLoadIdentity,glLoadMatrix等)的所有后续调用将仅影响活动矩阵.
我没有得到的是为什么有3个(在某些情况下为4个)不同的矩阵?我应该使用哪一个?(我可能会得到很多"使用着色器",但我不能.受学校限制...)我什么时候应该切换并激活不同的矩阵?利用所有这些而不仅仅使用一个有什么好处?
谢谢你的帮助 :)
glMatrixMode不会"激活"矩阵.OpenGL固定管道使用3个矩阵(有时4个):两个负责转换几何,一个用于转换纹理空间(有些实现用于颜色调整).这些矩阵一直在使用.
该模型视图矩阵用于移动geoemtry左右.由于OpenGL没有"相机",因此通过移动"相机"运动的相反(=反向)所有几何体来定位观察者.
所述投影矩阵用于从模型视图变换空间的几何形状成夹的空间,即它突出的几何变换到所述视口.
的纹理矩阵变换纹理坐标.在直接给出(s,t,r,q)的情况下,该矩阵的益处首先不清楚.但是OpenGL还允许从顶点位置生成纹理坐标.这与纹理矩阵一起允许实现投影纹理.
该色彩矩阵较少使用,并在所有实现(这是一个扩展的一部分),甚至没有用.如果可用,它会转换传入的顶点颜色.既然没有隐含的颜色生成器那么有什么用呢?嗯,它可以用于在线性颜色空间之间进行转换,例如RGB-> XYZ或任何其他可以表示为标量矩阵的颜色空间转换.这些天没有人使用颜色矩阵,着色器可以更好地完成工作.
glMatrixMode就在那里,所以没有大量的功能.否则你需要:
glModelviewLoadIdentity
glModelviewLoadMatrix
glModelviewMultMatrix
glModelviewRotate
glModelviewTranslate
glModelviewScale
glModelviewPushMatrix
glModelviewPopMatrix
glProjectionLoadIdentity
glProjectionLoadMatrix
glProjectonMultMatrix
glProjectionRotate
glProjectionTranslate
glProjectionScale
glProjectionPushMatrix
glProjectionPopMatrix
Run Code Online (Sandbox Code Playgroud)
等等.此外,您无法在投影和纹理矩阵中使用glFrutum等函数.你也需要其中的两个.
最后但并非最不重要的一个重要提示.设置视口和投影矩阵属于渲染功能.你会看到的大多数教程将它们放在窗口大小调整处理程序中,这是完全错误的地方.不要模仿这个坏习惯.
如果使用固定功能管道(即"无着色器"),您将使用所有这些.实际上,您也将它们与着色器一起使用,但在这种情况下您将自己实现它们.
OpenGL的这一部分起初很难掌握,虽然它实际上非常简单.当您选择特定矩阵时,这不会打开或关闭任何内容.它所做的就是使像glTranslatef这样的函数与你选择的一个特定矩阵一起工作.
OpenGL以这样的方式工作(除了直接状态访问),例如使用纹理和缓冲区,以相同的方式.
编辑:至于为什么有几个矩阵,他们都做不同的事情.你的模型通常在他们的"自己的空间",这意味着他们需要以某种方式转移到"世界",通过适当地缩放它们并将它们转换到正确的位置.然后,所有事物(整个"世界")都需要根据您的"眼睛位置"进行转换,并且必须将其转换为"标准化"剪辑空间,因为这就是硬件如何以最有效的方式实现的方式等等等
所有这些矩阵通常相乘(不知道发生了这种情况).
如果谷歌的OpenGL改造管道,你会得到很多的详细解释的时候,会发生什么情况,例如良好的资源此.
或者,阅读规范(在opengl.org免费提供),它包含非常明确的(在我看来很容易)有关如何看待所有看似复杂的矩阵内容的信息.