0

OpenGL 2.0 の時間に合わせて OpenGL コードを少し最新化しようとしていますが、黒い画面しか表示されません...おそらく誰かが私のコードの間違いを見つけました (それほど多くのコードではありません)。

これは、私の古い完全に機能するコードの関連部分の抜粋です。

// Send color data into GPU memory
glEnableClientState(GL_COLOR_ARRAY);
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, colorsHandle);
GL15.glBufferData(GL15.GL_ARRAY_BUFFER, colors, GL15.GL_DYNAMIC_DRAW);
glColorPointer(4, GL_FLOAT, 0, 0);

// Send vertex data into GPU memory
glEnableClientState(GL_VERTEX_ARRAY);
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, verticesHandle);
GL15.glBufferData(GL15.GL_ARRAY_BUFFER, GL15.GL_DYNAMIC_DRAW);
glVertexPointer(3, GL_FLOAT, 0, 0);

// Send texcoords data into GPU memory
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, texcoordsHandle);
GL15.glBufferData(GL15.GL_ARRAY_BUFFER, GL15.GL_DYNAMIC_DRAW);
glTexCoordPointer(2, GL_FLOAT, 0, 0);

for (Batch batch : batches) batch.render();

glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);

... バッチ呼び出し glDrawArrays (いくつかの opengl 状態の変更を行っている間) ...

glDrawArrays(GL_QUADS, spriteOffset * 4, spriteCount * 4);

そして、ここに新しいコードがあります:

// Send color data into GPU memory
GL20.glEnableVertexAttribArray(0);
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, colorsHandle);
GL15.glBufferData(GL15.GL_ARRAY_BUFFER, colors, GL15.GL_DYNAMIC_DRAW);
GL20.glVertexAttribPointer(0, 4, GL_FLOAT, false, 0, 0);

// Send vertex data into GPU memory
GL20.glEnableVertexAttribArray(1);
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, verticesHandle);
GL15.glBufferData(GL15.GL_ARRAY_BUFFER, vertices, GL15.GL_DYNAMIC_DRAW);
GL20.glVertexAttribPointer(1, 3, GL_FLOAT, false, 0, 0);

// Send texcoords data into GPU memory
GL20.glEnableVertexAttribArray(2);
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, texcoordsHandle);
GL15.glBufferData(GL15.GL_ARRAY_BUFFER, texcoords,GL15.GL_DYNAMIC_DRAW);
GL20.glVertexAttribPointer(2, 2, GL_FLOAT, false, 0, 0);

for (Batch batch : batches) batch.render();

GL20.glDisableVertexAttribArray(0);
GL20.glDisableVertexAttribArray(1);
GL20.glDisableVertexAttribArray(2);

私が言ったように、コードの最初のビットは完全に機能しますが、2 番目のコードは何も描画しません。これらはレンダラーで変更した唯一のコード行であり、正しいように見えます。しかし、明らかにどこかに問題があります... レンダリングされない原因は何でしょうか?

4

1 に答える 1

1

変更したのが本当にこれらの行だけである場合、シェーダーを実装していないと思いますか?

OpenGLES 2.0 には固定関数のパイプラインがないため、頂点/フラグメント シェーダーを記述し、それらをコンパイルし、プログラム オブジェクトをリンクする必要があります。

検索すれば、これに関する多くのチュートリアルを見つけることができると確信しています。

于 2012-06-25T22:58:36.433 に答える