1

我似乎发现在顶点着色器中将向量与矩阵相乘的帖子适用于我的台式机,但不适用于我的 Android 手机。

我正在使用 libGDX 和 GLES2.0 编写游戏。我有相当一部分在桌面上运行,但是当我尝试在 Android 上运行它时,它只显示空白的清晰颜色。通过乱搞,我发现问题只存在于我在顶点着色器中使用矩阵时。有问题的顶点着色器是:

attribute vec3 aVertPos;
attribute vec2 aTexCoord;

uniform mat4 uCamMatrix;
uniform vec3 uPosition;
uniform vec2 uSize;

varying vec2 vTexCoord;

void main() {
  vTexCoord = aTexCoord;

  vec3 scale = vec3(uSize,0.0);
  vec4 dest = vec4((aVertPos*scale)+uPosition,1.0) * uCamMatrix;
  gl_Position = dest;
}

我发现即使我将 uCamMatrix 作为单位矩阵传递,我仍然会出现空白屏幕。非常困惑,我环顾四周其他着色器 - 没想到结果 - 切换了该行中矩阵和向量的顺序:

vec4 dest = uCamMatrix * vec4((aVertPos*scale)+uPosition,1.0);

在传递矩阵之前我一直在转置矩阵,所以我停止这样做,因为我正在更改顺序。这完全解决了这个问题。

桌面版看起来和往常一样,所以计算结果一定是以前的样子。

那么Android/GLES20 是否对矩阵乘法有一些怪癖?这是一个错误吗?我只是错过了一些明显的东西吗?

4

1 回答 1

0

如果是矩阵乘法错误,那么下面的代码应该可以解决问题。(但老实说,我认为问题一定出在您的代码中的其他地方)。

代码转置矩阵,因此矩阵可以位于向量的左侧(这是一种非常低效的方式 - 您应该只使用此代码检查矩阵乘法是否正确)。

attribute vec3 aVertPos;
attribute vec2 aTexCoord;

uniform mat4 uCamMatrix;
uniform vec3 uPosition;
uniform vec2 uSize;

varying vec2 vTexCoord;

void main() {
  vTexCoord = aTexCoord;

  vec3 scale = vec3(uSize,0.0);
  vec4 dest = transpose(uCamMatrix) * vec4((aVertPos*scale)+uPosition,1.0);
  gl_Position = dest;
}

mat4 transpose(mat4 m){
    return mat4(
            m[0][0],m[1][0],m[2][0],m[3][0],
            m[0][1],m[1][1],m[2][1],m[3][1],
            m[0][2],m[1][2],m[2][2],m[3][2],
            m[0][3],m[1][3],m[2][3],m[3][3]
            );
}
于 2012-07-27T07:58:26.673 回答