OpenGL ES 2.0矩阵

时间:2010-12-15 13:56:33

标签: matrix opengl-es-2.0

这是我的顶点着色器代码:

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]);

如何使用多个矩阵?

2 个答案:

答案 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相乘和发送一个矩阵的性能影响,我很想知道这一点。