Концептуальный вопрос OpenGL - PullRequest
4 голосов
/ 08 августа 2011

Я только начинаю программирование на OpenGL в Win32 C ++, так что не будь слишком настойчивым со мной :) Я немного бродил по учебным пособиям NeHe и «красной книге», но я в замешательстве. До сих пор я был в состоянии настроить окно OpenGL, нарисовать несколько треугольников и т.д., без проблем. Но сейчас я хочу построить модель и посмотреть на нее с разных сторон. Мы тоже:

  1. Загрузка модели в память (сохранение координат треугольников / квадратов в структурах в куче), и при каждом рендеринге сцены мы рисуем все, что имеем, на экране, используя glVertex3f и так далее.

  2. Загрузите / нарисуйте модель один раз, используя glVertex3f и т. Д., И мы можем просто изменить положение просмотра в каждой сцене.

  3. Другое ...

Мне кажется, что вариант 1 наиболее правдоподобен из всех, что я читал до сих пор, однако, кажется, он немного эхх ... тупой! Нужно ли решать, какие объекты видны, а рисовать только те Разве это не очень медленно? Вариант 2 может показаться более привлекательным:)

РЕДАКТИРОВАТЬ: Спасибо за всю помощь, я решил сделать: прочитать мою модель из файла, затем загрузить ее в память графического процессора с помощью glBufferData и затем передать эти данные в функцию рендеринга, используя glVertexPointer и glDrawArrays.

Ответы [ 2 ]

7 голосов
/ 08 августа 2011

Прежде всего вам необходимо понять, что OpenGL на самом деле не понимает термин "модель" , все, что видит OpenGL, - это поток входящих вершин, и в зависимости от текущего режима он использует эти потоки вершины для рисования треугольников на экране.

Каждая итерация рисования кадра следует некоторой схеме, подобной этой:

  • очистить все буферы
  • для каждого элемента окна (основная сцена, HUD, мини-карта и т. Д.):
    • установка ножниц и видового экрана
    • условно чистая глубина и / или трафарет
    • установить матрицу проекции
    • установить матрицу вида модели для начального вида
    • для каждой модели
      • применить преобразование модели к стеку матриц
      • привязка данных модели (текстуры, вершины и т. Д.)
      • выдача команд рисования модели
  • буферы подкачки

OpenGL не помнит, что там происходит. Была (есть) какая-то возможность, называемая Отображаемые списки , но они не способны хранить все виды команд - также они устарели и удалены из последних версий OpenGL. Команды непосредственного режима glBegin, glEnd, glVertex, glNormal и glTexCoord также были удалены.

Таким образом, идея заключается в том, чтобы загрузить некоторые данные (текстуры, массивы вершин и т. Д.) В буферные объекты OpenGL. Однако только текстуры непосредственно понимаются OpenGL как то, что они (изображения). Все остальные виды буферов требуют, чтобы вы указали OpenGL, как с ними обращаться. Это делается с помощью вызовов gl {Vertex, Color, TexCoord, Normal, Attrib} Pointer для установки параметров доступа к данным и glDraw {Arrays, Elements} для запуска OpenGL, извлекающих поток вершины для подачи в растеризатор.

4 голосов
/ 08 августа 2011

Вы должны загрузить данные в память GPU один раз, а затем нарисовать каждый кадр, используя как можно меньше команд.

Ранее это было сделано с использованием списков отображения.В настоящее время все дело в объектах буфера вершин (также называемых VBO), поэтому посмотрите на них.

Вот учебник о VBO, написанный до того, как они стали только расширением, а не основной частьюOpenGL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...