シンプルなテクスチャクワッドをVBOとしてレンダリングしようとしています。VBOを使用しない場合、すべてが期待どおりに機能します(ただし、静的オブジェクトの場合は、フレームごとに頂点データを更新しているため、意味がないように見えるため、VBOに切り替えます)。
しかし、私は何か間違ったことをしているに違いありません。なぜなら、画面に何も、絶対にジルチでレンダリングされないからです。
これが私が持っている関連コードです:
コンストラクタ:
public VBO() {
updateVertexData();
vertexBuf = ByteBuffer.allocateDirect(vertices.length * 4).order(ByteOrder.nativeOrder()).asFloatBuffer();
vertexBuf.put(vertices);
vertexBuf.position(0);
//Create buffers array for VBO (I'm using interleaved data so only 1 needed here??
final int buffers[] = new int[1];
GLES20.glGenBuffers(1, buffers, 0);
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, buffers[0]);
GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, vertexBuf.capacity() * 4, vertexBuf, GLES20.GL_STATIC_DRAW);
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0);
mBufferIdx = buffers[0];
vertexBuf.limit(0);
vertexBuf = null;
}
頂点の更新
public void updateVertexData(){
vertices[0]=-1;
vertices[1]=1f;
vertices[2]=0;
vertices[3]=0;
vertices[4]=0;
vertices[5]=1;
vertices[6]=1f;
vertices[7]=0;
vertices[8]=1;
vertices[9]=0;
vertices[10]=-1;
vertices[11]=-1f;
vertices[12]=0;
vertices[13]=0;
vertices[14]=1;
vertices[15]=1;
vertices[16]=-1f;
vertices[17]=0;
vertices[18]=1;
vertices[19]=1;
}
レンダリング
public void drawVBO(){
GLES20.glUseProgram(iProgId);
mMVPMatrixHandle = GLES20.glGetUniformLocation(iProgId, "uMVPMatrix");
GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mvpMatrix, 0);
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, mBufferIdx);
GLES20.glEnableVertexAttribArray(iPosition);
GLES20.glVertexAttribPointer(iPosition, 3, GLES20.GL_FLOAT, false, 5 * 4, 0);
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, mBufferIdx);
GLES20.glEnableVertexAttribArray(iTexCoords);
GLES20.glVertexAttribPointer(iTexCoords, 2, GLES20.GL_FLOAT, false, 5 * 4, 3);
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0);
GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);
}
私が言ったように、VBOコードを取り除き、コードをupdateVertexDataからdrawメソッドに戻すと、すべて正常に機能します。誰かが私がここで間違っていることを説明できれば幸いです....
問題は、2番目の ' glVertexAttribPointer '行のオフセットでした。
元の行
GLES20.glVertexAttribPointer(iTexCoords, 2, GLES20.GL_FLOAT, false, 5 * 4, 3);
'offset'パラメーター(最後の '3')が間違っていました。3は位置データ(x、y、z)のサイズであり、これに4(浮動小数点あたりのバイト数)を掛ける必要があります。そう...
正しいコード
//For readability
final int POSITION_SIZE = 3;
final int BYTES_PER_FLOAT = 4;
final int TEXTURE_SIZE = 2;
final int STRIDE = (POSITION_SIZE+TEXTURE_SIZE)*BYTES_PER_FLOAT
//Correct line
GLES20.glVertexAttribPointer(iTexCoords, 2, GLES20.GL_FLOAT, false, STRIDE, (POSITION_SIZE*BYTES_PER_FLOAT));
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加