我似乎发现在顶点着色器中将矢量与矩阵相乘可以在我的桌面计算机上运行,但不能在我的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也有一些关于矩阵乘法的怪癖吗?这是一个错误吗?我只是遗漏了一些明显的东西吗?
答案 0 :(得分:0)
如果是矩阵乘法错误,那么下面的代码应该可以解决问题。 (但说实话,我认为问题必须在你的代码中的其他地方)。
代码转换矩阵,因此矩阵可以位于向量的左侧(这是以非常低效的方式完成的 - 您应该只使用此代码来检查矩阵乘法是否正确完成)。 / p>
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]
);
}