Использование VBO / IBO в OpenGL ES 2.0 на Android - PullRequest
3 голосов
/ 21 марта 2012

Я пытаюсь создать простую тестовую программу для Android (API 10), используя OpenGL ES 2.0, чтобы нарисовать простой прямоугольник. Я могу заставить это работать с плавающими буферами, ссылающимися на вершины напрямую, но я бы предпочел сделать это с VBO / IBO. Я искал бесчисленные часы, пытаясь найти простое объяснение (учебное пособие), но еще не нашел его. Мой код компилируется и работает просто отлично, но на экране ничего не отображается, кроме чистого цвета.

Вот несколько фрагментов кода, которые помогут объяснить, как я настроил его прямо сейчас.

Часть onSurfaceChanged ():

int[] buffers = new int[2];
GLES20.glGenBuffers(2, buffers, 0);
rectVerts = buffers[0];
rectInds = buffers[1];
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, rectVerts);
GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, (rectBuffer.limit()*4), rectBuffer, GLES20.GL_STATIC_DRAW);

GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, rectInds);
GLES20.glBufferData(GLES20.GL_ELEMENT_ARRAY_BUFFER, (rectIndices.limit()*4), rectIndices, GLES20.GL_STATIC_DRAW);

Часть onDrawFrame ():

GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, rectVerts);
GLES20.glEnableVertexAttribArray(0);
GLES20.glVertexAttribPointer(0, 3, GLES20.GL_FLOAT, false, 0, 0);
GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, rectInds);
GLES20.glDrawElements(GLES20.GL_TRIANGLES, 6, GLES20.GL_INT, 0);

1 Ответ

3 голосов
/ 21 марта 2012

Я не вижу ничего сразу неправильного, но вот некоторые идеи, которые вы можете затронуть.

1) «Компилирование и запуск в порядке» - бесполезный показатель для программы opengl. Об ошибках сообщается посредством активного вызова glGetError и проверки состояния компиляции и связывания шейдеров с помощью glGet (Shader | Program) iv. Проверяете ли вы где-нибудь ошибки?

2) Вы не должны предполагать, что 0 является правильным индексом для вершин. Это может сработать сейчас, но, вероятно, сломается позже, если вы измените свой шейдер. Получить правильный индекс с glGetAttribLocation.

3) Вы связываете буфер verts наDraw, но я ничего не вижу в буфере индексов. Это всегда связано?

4) Вы также можете попробовать нарисовать VBO с помощью glDrawArrays, чтобы вывести индексный буфер из уравнения, просто чтобы помочь отладке увидеть, какая часть неправильна.

В противном случае то, что у вас есть, выглядит правильным, насколько я могу судить в этом небольшом фрагменте. Может быть, что-то еще вне этого идет не так.

...