OpenGL извлекает данные из тайного буфера

#opengl #vbo #gldrawarrays

#opengl #vbo #gldrawarrays

Вопрос:

У меня проблема с рисованием объекта buffer без индекса. Другие мои проиндексированные VBO отрисовываются нормально…

 void drawArray(VertexArrayObject VAO)
{
    GL11.glColor3d(1.0f, 0.2f, 0.2f);
    GL11.glEnableClientState(GL11.GL_VERTEX_ARRAY);

    GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, VAO.southSkirtBufferID);
    GL11.glDrawArrays(GL11.GL_TRIANGLE_STRIP, 0, VAO.southSkirtLength);

    GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);     
    GL11.glDisableClientState(GL11.GL_VERTEX_ARRAY);
}
  

Комментарии:

1. Им владеют, но кем ?

Ответ №1:

Вы не используете свой «буфер юбки» для рисования. В drawArray вы фактически устанавливаете указатель вершины так, чтобы он указывал на смещение 0 в VAO.vertexBufferID (что бы это ни было на тот момент. И вы никогда не настраиваете его ни на что другое.

Ссылка на буфер является частью указателя атрибута вершины, для этого указателя будет использоваться текущая привязка GL_ARRAY_BUFFER на момент gl*Pointer() вызова. GL_ARRAY_BUFFER Привязка во время вызова draw абсолютно не имеет значения, и простое изменение этой привязки не влияет на указатели атрибутов.

Если вы рендерите только юбки, произойдет сбой, потому что ваши указатели атрибутов вообще не настроены ни на что полезное.

Комментарии:

1. vertexBufferID и его индекс представляют собой совершенно другой набор данных. Они заполняют большую часть блока, для которого они сгенерированы, за исключением восточного и южного краев, которые я оставляю для буфера skirtBuffer. Буфер юбки — это буфер вершин, который должен отображаться в виде треугольной полосы.

2. Добавление glVertexPointer ранее приводило к ошибкам, но, должно быть, оно было в неправильном месте. Два миллиарда очков для вас!