Opengl 将矩阵传递到glsl着色器

Opengl 将矩阵传递到glsl着色器,opengl,graphics,matrix,glsl,shader,Opengl,Graphics,Matrix,Glsl,Shader,所以如果一个给定的网格带有一个给定的矩阵变换,我想在我的顶点着色器中使用该变换,那么一旦它已经传入,我该如何使用它呢。让我们称之为“myMatrix” 所以我要做的是: varying vec3 modelPos = (gl_ModelViewMatrix * myMatrix * vec4(positionIn, 1)).xyz; gl_Position = (gl_ProjectionMatrix * vec4(modelPos, 1)); 其中“positionIn”是传

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

所以我要做的是:

    varying vec3 modelPos = (gl_ModelViewMatrix * myMatrix * vec4(positionIn, 1)).xyz;
    gl_Position = (gl_ProjectionMatrix * vec4(modelPos, 1));
其中“positionIn”是传入的顶点


但这似乎不起作用(屏幕上没有显示任何内容)。如果我去掉“myMatrix”,对象将正常渲染,但当然它没有应用其变换

在声明vert着色器的main()函数之前,只需将其声明为uniform mat4 myMatrix

因为每个人都在试图告诉您,乘法顺序取决于矩阵所表示的内容。你说“旋转”。我们说“在什么坐标系下旋转?”

在您引用的代码中,
myMatrix
最接近您的原始顶点位置。因此,如果这是围绕x轴旋转45度,那么它将围绕对象空间的x轴旋转45度,其中原点相对于存储的顶点位置为(0,0,0),轴类似于顶点位置的自然轴

如果您颠倒顺序,您有: 可变的vec3 modelPos=(myMatrix*gl_ModelViewMatrix*vec4(positionIn,1)).xyz

现在首先进行ModelView变换,因为它最接近原始对象空间的顶点位置。因此,现在
myMatrix
在摄影机空间中运行,原点位于摄影机,z轴沿摄影机的视图向量

如果要围绕世界空间的x轴旋转,则在仍然使用旧式固定函数变换矩阵的情况下,在顶点着色器中没有简单的方法可以做到这一点。对于固定函数矩阵,您可以在设置时将自定义矩阵应用于软件中的ModelView矩阵


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

如果不告诉我们所有这些矩阵的实际内容,则很难知道问题所在。gl_ModelViewMatrix和gl_ProjectionMatrix是glsl提供的预定义矩阵。这里唯一“独特”的矩阵是myMatrix,它可以是旋转、平移等,我很清楚它们的意思;我问它们的内容是什么。比如具体的数字。更重要的是,如果你已经在使用固定函数矩阵,为什么要在计算中插入矩阵?我不明白你为什么需要实际的数字。我想问的是,如果我想应用一个随机矩阵,它可以是任何东西,从旋转到平移,等等,我怎么把它和其他矩阵一起插入?我上面的顺序正确吗?我是否使用了错误的glsl矩阵?gl_modelView和gl_Projection仅更改顶点的坐标系,但不对它们执行任何其他操作,这就是我希望传入矩阵的原因。如果
myMatrix
是?这是一个很好的测试开始
varying vec3 modelPos = (gl_ModelViewMatrix * myMatrix * vec4(positionIn, 1)).xyz;