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 に答える