2

次のシェーダーがあります。

protected final static String vertexShaderCode =
    "attribute vec4 vPosition;" +
    "attribute vec2 texCoord;" +
    "attribute mat4 uMVPMatrix;   \n" +

    "varying vec2 vTexCoord;" +

    "void main() {" +
    "  gl_Position = uMVPMatrix * vPosition;" +
    "  vTexCoord = texCoord;" +
    "}";

mvp マトリックスを属性として渡したいのですが、正しくバインドされていないようです。自動割り当てバインディングを使用しています。次のようにプログラムをリンクした後、属性の場所を照会すると:

// program linked previously
GLES20.glUseProgram(program);
GLES20.glEnable(GLES20.GL_TEXTURE_2D);

GLES20.glEnable(GLES20.GL_BLEND);
mPositionHandle = GLES20.glGetAttribLocation(program, "vPosition");
mTextureHandle = GLES20.glGetAttribLocation(program, "texCoord");
mtextureSampHandle = GLES20.glGetAttribLocation(program, "textureSamp");
mMVPMatrixHandle = GLES20.glGetAttribLocation(program, "uMVPMatrix");

返されるハンドルは次のとおりです。

mTextureHandle: 0

mMVPMatrixHandle: 1

mPositionHandle: 2

ただし、ここのドキュメントから: http://www.khronos.org/opengles/sdk/docs/man/xhtml/glBindAttribLocation.xml、mVMVPMatrixHandle には、マトリックスの各列に 1 つずつ、4 つの連続したハンドルを割り当てる必要があります (つまり、mVMVPMatrix はハンドル 1,2,3,4 を持っています)。これは事実ではなく、私には理由がわかりません...

その結果、画面に何も描画できません。完全を期すために、次のようにマトリックスをロードしようとしています。

    GLES20.glVertexAttribPointer(mMVPMatrixHandle2, 4, GLES20.GL_FLOAT, false, 0, t1);
    GLES20.glVertexAttribPointer(mMVPMatrixHandle2 + 1, 4, GLES20.GL_FLOAT, false, 0, t2);
    GLES20.glVertexAttribPointer(mMVPMatrixHandle2 + 2, 4, GLES20.GL_FLOAT, false, 0, t3);        
    GLES20.glVertexAttribPointer(mMVPMatrixHandle2 + 3, 4, GLES20.GL_FLOAT, false, 0, t4);

ここで、t1 ~ t4 は、mvp 行列の個々の行を含むバッファーです。

{
    1.74f, 0, 0, 0,
    0, 2.9f, 0, 0,
    0, 0, -2.414f, -1f,
    -2.088f, 0, -2.66f, 3
}

これは、uMVPMatrix を均一の mat4 として定義し、glUniformMatrix4fv でロードすると機能します。

4

1 に答える 1

1

問題は私のカードではなく、電話にあることが判明しました。Samsung Galaxy S2 で試したところ、属性が適切に割り当てられ、期待どおりに動作しました。

問題の電話は、Adreno 205 グラフィックス カードを搭載した HTC Incredible S です。電話/グラフィックス カードの Opengl 実装に問題があるに違いないと思います。解決策として、シェーダーで行列を 4 つの vec4 として定義し、要素ごとに位置を計算することが考えられます。

于 2012-12-19T07:24:43.807 に答える