Понимание кода, используемого для рисования четырехугольников в ядре OpenGL 3.3+ с использованием треугольников - PullRequest
3 голосов
/ 29 апреля 2011

Я пытаюсь нарисовать квад для фона (2D), используя OpenGL 3.x +.Четверки устарели, поэтому цель состоит в том, чтобы использовать два треугольника, чтобы создать прямоугольник, который заполняет экран.Это работает, но я не уверен на все 100% здесь.

  1. Настройка

    GLuint positionBufferObject;
    GLfloat vertexPositions[] =
    {
        -1.0f, -1.0f, 0.0f, 1.0f,
        -1.0f,  1.0f, 0.0f, 1.0f,
         1.0f,  1.0f, 0.0f, 1.0f,
         1.0f, -1.0f, 0.0f, 1.0f,
        -1.0f, -1.0f, 0.0f, 1.0f,
    };
    glGenBuffers(1, &positionBufferObject);
    glBindBuffer(GL_ARRAY_BUFFER, positionBufferObject);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertexPositions), vertexPositions, GL_STATIC_DRAW);
    
    • Я понимаю vertexPositions, это массив вершин.
    • glGenBuffers() говорит:Я хочу 1 буфер и назначить идентификатор для &positionBufferObject?
    • glBufferData() загружает vertexPositions в память графического процессора;но как он узнал, что его нужно загрузить, так как я не дал ему удостоверение личности?
  2. Draw

    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 5);
    glDisableVertexAttribArray(0);
    
    • glEnableVertexAttribArray() просто говорит, что я собираюсь рисовать с массивом 0?
    • glDrawArrays() - что если я хочу нарисовать два массива вершин?Как он узнает, какие из них визуализировать?Он знает, что из приведенной выше команды?
    • Не уверен, что делает glVertexAttribPointer()?
    • glDrawArrays() ясно.
  3. Очиститьвверх, я думаю, это правильно?

    glBindBuffer(GL_ARRAY_BUFFER, 0);
    glDeleteBuffers(1, &positionBufferObject);
    

    Настройка / очистка выполняется только один раз.

Бонусные баллы:

  • Это самый эффективный способ сделать это?Я прочитал, что я предполагаю, что отправляю и выполняю рендеринг в «пакетах» [?], Поскольку 3.x + больше не выполняет немедленный режимСуществует также только один массив, поэтому пакеты в этом случае не повлияют на производительность, но если бы я сказал «очень большое количество» vertxArrays для рисования, это был бы тот же процесс?
  • В настройке онисохраняют идентификатор массива как positionBufferObject, но жестко его кодируют в цикле рендеринга.Кажется, что после дюжины массивов может возникнуть путаница, почему не стоит использовать переменную вместо ее жесткого кодирования?

Ответы [ 2 ]

7 голосов
/ 29 апреля 2011

glGenBuffers(1, &positionBufferObject); говорит: «создайте объект буфера вершин, а positionBufferObject - его идентификатор».

glBindBuffer(GL_ARRAY_BUFFER, positionBufferObject); говорит: "positionBufferObject теперь является текущим GL_ARRAY_BUFFER."

glBufferData(GL_ARRAY_BUFFER, sizeof(vertexPositions), vertexPositions, GL_STATIC_DRAW); говорит: «загрузить vertexPositions на идентификатор, который в настоящее время связан с GL_ARRAY_BUFFER (то есть positionBufferObject)».

glEnableVertexAttribArray(0); говорит, что «массив атрибутов вершины 0 теперь доступен для использования».

glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0); говорит, что «массив атрибутов вершины 0 следует интерпретировать как состоящий из групп из 4 чисел с плавающей запятой».

glDrawArrays(GL_TRIANGLE_STRIP, 0, 5); говорит: «нарисуйте треугольную полосу с пятью индексами из каждого включенного массива».

glDisableVertexAttribArray(0); говорит: «Мы закончили с массивом атрибутов вершины 0».

3 голосов
/ 16 июня 2011

В ответ на вопрос user697111 о нескольких массивах, это довольно просто.

Каждый атрибут вершины должен быть связан с буферным объектом. Вместо того, чтобы указывать объект буфера с помощью glVertexAttribPointer, ассоциация выполняется через GL_ARRAY_BUFFER. Когда вы вызываете glVertexAttribPointer (или любой вызов gl * Pointer), буфер, который в настоящее время связан с GL_ARRAY_BUFFER, будет использоваться в качестве источника для этого атрибута. Итак, рассмотрим следующее:

glBindBuffer(GL_ARRAY_BUFFER, myPositionData);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, ..., 0);
glBindBuffer(GL_ARRAY_BUFFER, myColorData);
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, ..., 0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glDrawArrays(...);

Атрибут 0 будет получен из объекта буфера myPositionData, а атрибут 1 будет получен из объекта буфера myColorData. Тот факт, что я отменил привязку к GL_ARRAY_BUFFER перед вызовом glDrawArrays, не меняет источник данных для этих атрибутов.

...