【问题标题】:Android GLES 2.0: post-multiplying by matrix doesn't workAndroid GLES 2.0:后乘矩阵不起作用
【发布时间】:2012-07-26 16:03:04
【问题描述】:

我似乎发现在顶点着色器中将向量与矩阵相乘的帖子适用于我的台式机,但不适用于我的 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 对矩阵乘法有什么奇怪的地方吗?这是一个错误吗?我只是错过了一些明显的东西吗?

【问题讨论】:

  • 听起来你在对我做正确的事,我猜是一个错误。
  • 什么设备/芯片组/GL驱动?我在使用某种 Qualcomm Adreno 的第二代 Nexus 7 平板电脑上遇到了类似的问题。

标签: android matrix glsl opengl-es-2.0 shader


【解决方案1】:

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

代码对矩阵进行了转置,因此矩阵可以位于向量的左侧(这样做的效率非常低 - 您应该只使用此代码检查矩阵乘法是否正确)。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 2011-10-02
    • 1970-01-01
    • 2013-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多