这是我的顶点着色器代码:
attribute vec4 position;
attribute vec4 inputTextureCoordinate;
varying vec2 textureCoordinate;
uniform mat4 modelViewProjMatrix;
void main()
{
gl_Position = modelViewProjMatrix * position;
textureCoordinate = inputTextureCoordinate.xy;
}
我在这段代码中更新了制服:
glUniformMatrix4fv(制服[UNIFORM_MODELVIEWMATRIX],1,0,[scaleMatrix getMatrix]);
但是当我执行此字符串时,最后更新结果(比例)重置:
glUniformMatrix4fv(制服[UNIFORM_MODELVIEWMATRIX],1,0,[rotationMatrix getMatrix]);
如何使用多个矩阵?
答案 0 :(得分:1)
你必须将矩阵相乘。在CPU中执行此操作并将结果作为统一传递。
答案 1 :(得分:1)
也可以向着色器发送多个矩阵。您必须在着色器中定义一个(或多个)其他统一mat4,并将其绑定到应用程序中的着色器程序。
您可以使用*运算符将着色器上的矩阵相乘,因此,如果您想要在应用位置,视图和投影之前对对象进行额外旋转,则着色器将如下所示:
attribute vec4 position;
attribute vec4 inputTextureCoordinate;
varying vec2 textureCoordinate;
uniform mat4 modelViewProjMatrix;
uniform mat4 rotationMatrix; //your new matrix
void main()
{
gl_Position = modelViewProjMatrix * rotationMatrix * position;
textureCoordinate = inputTextureCoordinate.xy;
}
请注意,在这种情况下,如果您不想进行任何旋转,则必须向着色器提供标识Matrix作为rotationMatrix。
您可能已经知道这一点,但只是为了确定:矩阵乘法是从右到左,所以如果你想围绕模型的轴进行旋转,然后在某处移动模型,你需要放置旋转矩阵在翻译矩阵的右侧。
如果有人知道发送两个矩阵与CPU相乘和发送一个矩阵的性能影响,我很想知道这一点。