1

そのため、それぞれ異なる場所にある 2 つの移動クワッドをレンダリングしようとしています。私のシェーダーは可能な限りシンプルです (頂点はモデルビュー投影マトリックスによってのみ変換され、色は 1 つだけです)。

何かをレンダリングしようとすると、色の断片だけになってしまいます。私は以前に OpenGL で 3D レンダリングを行ったことがあるだけなので、2D のものに問題があります。

これが私の基本的なレンダリング ループで、少し単純化されています (私は によって提供される Matrix 操作メソッドを使用しておりandroid.opengl.Matrixprogramこれは私が作成したカスタム クラスで、 を呼び出すだけですGLES20.glUniformMatrix4fv())。

Matrix.orthoM(projection, 0, 0, windowWidth, 0, windowHeight, -1, 1);
program.setUniformMatrix4f("Projection", projection);

この時点で、クワッドをレンダリングします (これはクワッドごとに繰り返されます)。

Matrix.setIdentityM(modelview, 0);
Matrix.translateM(modelview, 0, quadX, quadY, 0);
program.setUniformMatrix4f("ModelView", modelview);
quad.render(); // calls glDrawArrays

そして、私が見るのは、各クワッドの色のスライバーだけです! 私はここで頭がいっぱいです。考えられることはすべて試しましたが、コンピューターに向かって叫び、部屋の向こう側に電話を放り投げているところです。誰かがポインタを持っていますか?ortho を間違って使用していますか? すべてを Z 値 0 でレンダリングしていることは 100% 確信しています。 のfrustumM代わりに を使用しorthoMてみました。フラスタムがどのように機能するかを正しく理解してください (とにかく、3D レンダリングに適しています)。

違いがある場合は、ビューポートを次のように定義しました

 GLES20.glViewport(0, 0, windowWidth, windowHeight);

windowWidthとは、 orthoMwindowHeightに渡される同じ値です。

編集:android.opengl.Matrix複数の行列を1つの配列に押し込むことができるように、メソッドが2番目のパラメータとしてオフセットを受け取ることに0注意する価値があるかもしれません。

別の編集:参考までに、これが私の頂点シェーダーコードです:

uniform mat4 ModelView;
uniform mat4 Projection;

attribute vec4 vPosition;

void main() {
    mat4 mvp = Projection * ModelView; 
    gl_Position = vPosition * mvp;
}

さらに別の編集:交換しようとProjection * ModelViewしましModelView * Projectionたが、今では本当にファンキーな形になっています...

4

2 に答える 2

0

私はこれをgamedev.stackexchange.comに投稿し、それを理解しました.here sa link

于 2012-07-07T17:04:12.460 に答える
0

mvp は Proj*ModelView である必要があります。

gl_Position は mvp * vPosition である必要があります。コードに示されているように、その逆ではありません。

それでも問題が解決しない場合は、問題をより詳しく説明できますか (画像が役立つ場合があります)。エラーが発生した場合に備えて、opengl コードをさらに投稿することも検討してください。あなたが投稿した残りのコードはすべて私には問題ないようです。

于 2012-07-07T05:31:02.887 に答える