1

因此,如果给定的网格带有给定的矩阵变换,并且我想在我的顶点着色器中使用该变换,那么一旦它已经传入,我该如何使用它。让我们称之为“myMatrix”。

所以我正在做的是:

    varying vec3 modelPos = (gl_ModelViewMatrix * myMatrix * vec4(positionIn, 1)).xyz;
    gl_Position = (gl_ProjectionMatrix * vec4(modelPos, 1));

其中“positionIn”是传入的顶点。

这似乎不起作用(屏幕上没有显示)。如果我取出“myMatrix”,对象会正常渲染,但当然它没有应用它的转换。

4

2 回答 2

2

正如每个人都试图告诉你的那样,乘法顺序取决于你的矩阵代表什么。你说“旋转”。我们说“在什么坐标系中旋转?”

varying vec3 modelPos = (gl_ModelViewMatrix * myMatrix * vec4(positionIn, 1)).xyz;

在您引用的代码myMatrix中,最接近您的原始顶点位置。因此,如果那是围绕 x 轴旋转 45 度,那么它将是围绕object-space的 x 轴旋转 45 度,其中原点是 (0,0,0) 相对于您存储的顶点位置和该轴同样是顶点位置的自然轴。

如果你颠倒顺序,你有:varying vec3 modelPos = (myMatrix * gl_ModelViewMatrix * vec4(positionIn, 1)).xyz;

现在 ModelView 变换首先发生,因为它最接近您的原始对象空间顶点位置。所以现在myMatrixcamera-space中操作,原点在相机处,z 轴沿着相机的视图向量。

如果你想绕world-space的 x 轴旋转,那么在顶点着色器中没有简单的方法可以做到这一点,同时仍然使用旧式的固定函数变换矩阵。使用固定函数矩阵,您可以在设置时将自定义矩阵应用于软件中的 ModelView 矩阵。

更现代的方法是通过自定义制服传递所有矩阵,而不使用内置函数。因此,您可以单独传入模型、视图和投影变换,并将自定义矩阵插入模型和视图之间。

于 2013-03-07T02:23:02.477 回答
0

只需在声明垂直着色器的 main() 函数之前将其声明为统一 mat4 myMatrix

于 2013-03-07T01:48:56.520 回答