2016-05-15 8 views
0

私はVBOとしてレンダリングする簡単なテクスチャ付きクワッドを取得しようとしています。 VBOを使用しないときは、すべてが期待どおりに機能します(ただし、静的オブジェクトの場合は、フレームごとに頂点データを更新しています(無意味なので、VBOに切り替えます)。Android OpenGL ES 2. 0 VBOレンダリングしない

しかし、私は何も得ないので、私は何かをしなければならない、絶対にzilch、画面にレンダリングされます。

コンストラクタ:

レンダリング

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コードを取り除くと、戻って私のdrawメソッドにupdateVertexDataからコードを移動する場合、私は、言うように、その後、すべてのはOKに動作します。誰かが私がここで間違っていることを説明することができれば感謝します....

+0

HI @RetoKoradi、コメントへの感謝は、私はちょうど* 4せずにそれを試してみましたが、それは違いはありません、私はまだ何もレンダリングされません取得します。しかし、私は最後に 'asFloatBuffer'を追加したので、VertexBufはByteBufferではなくFloatBufferになりますか?ありがとう。 – Zippy

+0

ああ、私は線が可視領域を越えて伸びたことを忘れていたので、私は水平にスクロールしなければならなかった。 –

+0

probs @ RetoKoradi、私はそれがうまくいかなかった理由を考え出しました:-) – Zippy

答えて

0

問題は2番目の 'glVertexAttribPointer'行のオフセットです。

オリジナルライン

GLES20.glVertexAttribPointer(iTexCoords, 2, GLES20.GL_FLOAT, false, 5 * 4, 3); 

は、 'オフセット' パラメータ(最後の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)); 
関連する問題