2013-07-20 2 views
0

У меня есть форма, которую я пытаюсь сделать через OpenGL ES 2.0 на Android 3.2. Я могу получить рендеринг своей сцены по назначению с помощью DrawArrays и FloatBuffer, но не через glGenBuffers и vbo/ibo.Android opengl es 2.0 Vertex/Index Buffer не работает

Вот некоторые фрагменты я использую с нерелевантными разделами выносимых

GLES20.glGenBuffers(1, vbo, 0); 
    GLES20.glGenBuffers(1, ibo, 0); 

    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, vbo[0]); 
    GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, this.vertexBuffer.capacity() * 4, vertexBuffer, GLES20.GL_STATIC_DRAW); 
    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0); 

    GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, ibo[0]); 
    GLES20.glBufferData(GLES20.GL_ELEMENT_ARRAY_BUFFER, indexBuffer.capacity() * 2, indexBuffer, GLES20.GL_STATIC_DRAW); 
    GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, 0); 

Выше мой код для создания своих массивов. Ниже приведен мой код для рендеринга.

GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, vbo[0]); 
    GLES20.glEnableVertexAttribArray(positionHandle); 
    GLES20.glVertexAttribPointer(positionHandle, 3, GLES20.GL_FLOAT, false, 3 * 4, vertexBuffer); 
    GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, ibo[0]); 

    GLES20.glDrawElements(GLES20.GL_TRIANGLE_STRIP, 1, GLES20.GL_UNSIGNED_SHORT, 0); 

    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0); 
    GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, 0); 

Я знаю, за то, что моя вершина поплавка буфер работает правильно, потому что если я заменить приведенный выше код с ниже код, он работает как задумано:

GLES20.glEnableVertexAttribArray(positionHandle); 
    GLES20.glVertexAttribPointer(positionHandle, 3, GLES20.GL_FLOAT, false, 3 * 4, vertexBuffer); 
    GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 3); 

В то время как я отладки, чтобы найти если бы DrawArrays работал (что он делает, если я удалю весь код, относящийся к буферам привязки), я обнаружил, что могу оставить все вызовы буфера gen/bind/data EXCEPT * GLES20.glBindBuffer (GLES20.GL_ARRAY_BUFFER, vbo [0]) ; *, это исключительно предотвратит рендеринг при использовании drawArrays

Я потратил весь день, пытаясь изменить небольшие детали и звонить в разных заказах безрезультатно.

Сначала я пытаюсь сделать куб со следующими данными: частный поплавка [] = {очка -1f, 1F, -1f,

      1f, 1f,  -1f, 
         -1f, 1f,  1f, 
         1f, 1f,  1f, 
         -1f, -1f, -1f, 
         1f, -1f, -1f, 
         -1f, -1f, 1f, 
         1f, -1f, 1f }; 
private short indecies[] = {0,1,2,3,6,7,4,5,0,1,1,5,3,7,7,6,6,2,4,0}; 

Но я решил пойти с этим данные испытаний и это работает в drawArrays без использования indicies

private float[] pts = {  -1,0,0, 
          1f,0,0, 
          0f,1,0}; 
private short[] indecies = {0,1,2}; 
+1

В этой строке «GLES20.glVertexAttribPointer (positionHandle, 3, GLES20.GL_FLOAT, false, 3 * 4, vertexBuffer)» последние два аргумента должны быть равны 0. В этой строке «GLES20.glDrawElements (GLES20.GL_TRIANGLE_STRIP, 1, GLES20.GL_UNSIGNED_SHORT, 0); " замените «1» на количество индексов. –

+0

Спасибо, я попробовал вторую вещь, о которой вы говорили ранее, но первое предложение было именно тем, что мне нужно! – user1055947

ответ

1

в случае, если кто-либо еще борются с этим позже, Киральным код рассказал мне, как исправить мою проблему, заменив

GLES20.glVertexAttribPointer(positionHandle, 3, GLES20.GL_FLOAT, false, 3 * 4, vertexBuffer); 

с

GLES20.glVertexAttribPointer(positionHandle, 3, GLES20.GL_FLOAT, false, 3*4, 0); 

использовать также отсчитывать indicies для соответствующего аргумента glDrawElements.

Смежные вопросы