因此,如果给定的网格物体带有给定的矩阵变换,并且我想在我的顶点着色器中使用该变换,那么一旦它已经传入,我该如何使用它。让我们称之为“myMatrix”。
所以我正在做的是:
varying vec3 modelPos = (gl_ModelViewMatrix * myMatrix * vec4(positionIn, 1)).xyz;
gl_Position = (gl_ProjectionMatrix * vec4(modelPos, 1));
其中“positionIn”是传入的顶点。
这似乎不起作用(屏幕上没有任何内容)。如果我取出“myMatrix”,该对象会正常呈现,但当然它没有应用它的转换。
答案 0 :(得分:2)
正如大家一直试图告诉你的那样,乘法顺序取决于你的矩阵代表什么。你说“轮换”。我们说“在什么坐标系中旋转?”
varying vec3 modelPos = (gl_ModelViewMatrix * myMatrix * vec4(positionIn, 1)).xyz;
在您引用的代码中,myMatrix
最接近您的原始顶点位置。因此,如果围绕x轴旋转45度,则围绕对象空间的x轴旋转45度,其中原点为(0,0,0)相对于存储的顶点位置,轴类似于顶点位置的自然轴。
如果您按顺序撤销订单,则: 改变vec3 modelPos =(myMatrix * gl_ModelViewMatrix * vec4(positionIn,1))。xyz;
现在首先发生ModelView变换,因为它最接近原始的对象空间顶点位置。所以现在myMatrix
正在相机空间中运行,其中原点位于相机处,z轴位于相机的视图矢量中。
如果你想围绕世界空间的x轴旋转,那么在使用旧式固定函数变换矩阵时,在顶点着色器中没有简单的方法可以做到这一点。 。使用固定函数矩阵,您可以在设置时将自定义矩阵应用于软件中的ModelView矩阵。
更现代的方法是通过自定义制服传递所有矩阵而不使用内置函数。因此,您可以单独传递模型,视图和投影变换,并在模型和视图之间插入自定义矩阵。
答案 1 :(得分:0)
在声明vert着色器的main()函数之前,只需将其声明为统一的mat4 myMatrix