OpenGL (ES) - Сохранение и использование цветового массива в VBO и применение его к треугольнику VBO. - PullRequest
0 голосов
/ 09 мая 2011

Как это можно сделать?Этот код не работает:


//////////INIT COLOR VBO FOR USE WITH A TRIANGLE    
triColorBuffer = ByteBuffer.allocateDirect(3 * 4
    * 4).order(ByteOrder.nativeOrder()).asFloatBuffer();        

float[] colors = { 
1f, 0f, 0f, 1f,
0f, 1f, 0f, 1f, 
0f, 0f, 1f, 1f,};

triColorBuffer.put(colors);
triColorBuffer.flip();
int[] buffer = new int[1];
gl11.glGenBuffers(1, buffer, 0);
colorPointerTri = buffer[0];
gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, colorPointerTri);
gl11.glBufferData(GL11.GL_ARRAY_BUFFER, triColorBuffer.capacity() 
    * 4, triColorBuffer, GL11.GL_STATIC_DRAW);

////////////DRAW USING COLOR VBO
gl11.glEnableClientState(GL10.GL_COLOR_ARRAY);
gl11.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl11.glPushMatrix();

gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, vertexPointerTri);
gl11.glBindBuffer(GL11.GL_ELEMENT_ARRAY_BUFFER, indexPointerTri);
gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, colorPointerTri);
gl11.glColorPointer(4, GL10.GL_FLOAT, 0, 0);
gl11.glVertexPointer(3, GL10.GL_FLOAT, 0, 0);
gl11.glDrawElements(GL10.GL_TRIANGLES, 3, GL10.GL_UNSIGNED_SHORT, 0);
gl11.glDisableClientState(GL10.GL_COLOR_ARRAY);
gl11.glDisableClientState(GL10.GL_VERTEX_ARRAY);

gl11.glPopMatrix();
gl11.glDisableClientState(GL10.GL_COLOR_ARRAY);
gl11.glDisableClientState(GL10.GL_VERTEX_ARRAY);
gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, 0);
gl11.glBindBuffer(GL11.GL_ELEMENT_ARRAY_BUFFER, 0);

Треугольник рисует VBO'd или nor, а цветовой градиент (glcolorpointer) работает не VBO'd, но я не могу получить треугольник VBO'd дляцвет с помощью цветного указателя (VBO или без).Помощь оценена.

Ответы [ 2 ]

3 голосов
/ 09 мая 2011

Вы связываете буфер вершин и сразу после этого связываете буфер цвета. Теперь, когда вы вызываете glColor / VertexPointer, цвета и вершины поступают из цветового буфера. Вам необходимо написать:

gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, vertexPointerTri);
gl11.glVertexPointer(3, GL10.GL_FLOAT, 0, 0);
gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, colorPointerTri);
gl11.glColorPointer(4, GL10.GL_FLOAT, 0, 0);

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

3 голосов
/ 09 мая 2011

Пожалуйста, исправьте меня, если я ошибаюсь, я начал с VBO всего 15 минут назад.

В любом случае, похоже, что вы должны использовать VBO "в два".Сначала вы связываете свои данные / массив, и сразу после этого сообщаете контексту GL, что вы только что дали.Мне потребовалось некоторое время, чтобы прочитать этот исходный файл , чтобы выяснить, что происходит, и искренне надеяться, что я не понял его полностью.Выдержка из этого файла;

if (useTexture) {
    gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, mTextureCoordBufferIndex);
    gl11.glTexCoordPointer(2, mCoordinateType, 0, 0);
}            
if (useColor) {
    gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, mColorBufferIndex);
    gl11.glColorPointer(4, mCoordinateType, 0, 0);
}

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

gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, vertexPointerTri);
gl11.glVertexPointer(3, GL10.GL_FLOAT, 0, 0);
gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, colorPointerTri);
gl11.glColorPointer(4, GL10.GL_FLOAT, 0, 0);
gl11.glBindBuffer(GL11.GL_ELEMENT_ARRAY_BUFFER, indexPointerTri);
gl11.glDrawElements(GL10.GL_TRIANGLES, 3, GL10.GL_UNSIGNED_SHORT, 0);

Кроме того, из того, что я видел, это не должно приносить вреда, если вы отсоединяете массивы после рендеринга.Может быть, это в вашем коде не скопировано / вставлено здесь, но на всякий случай.

gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, 0);
gl11.glBindBuffer(GL11.GL_ELEMENT_ARRAY_BUFFER, 0);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...