0

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

attribute vec4 position;
attribute vec4 inputTextureCoordinate;

varying vec2 textureCoordinate;

uniform mat4 modelViewProjMatrix;

void main()
{
    gl_Position = modelViewProjMatrix * position;
textureCoordinate = inputTextureCoordinate.xy;
}

我在这段代码中更新了制服:

glUniformMatrix4fv(uniforms[UNIFORM_MODELVIEWMATRIX], 1, 0, [scaleMatrix getMatrix]);

但是当我执行此字符串时,最后更新结果(比例)重置:

glUniformMatrix4fv(uniforms[UNIFORM_MODELVIEWMATRIX], 1, 0, [rotationMatrix getMatrix]);

如何使用多个矩阵?

4

2 回答 2

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;
}

请注意,在这种情况下,如果您不想进行任何旋转,则必须向着色器提供一个恒等矩阵作为 rotationMatrix。

您可能已经知道这一点,但请确定:矩阵乘法是从右到左的,所以如果您想围绕模型的轴进行旋转,然后将模型移动到某处,您需要将旋转矩阵放在右边你的翻译矩阵。

如果有人知道发送两个矩阵与在 CPU 上相乘并发送一个矩阵对性能的影响,我很想知道这一点。

于 2010-12-22T10:33:38.143 回答
1

您必须将矩阵相乘。在 CPU 中执行此操作并将结果作为制服传递。

于 2010-12-15T14:00:18.147 回答