Как Modern OpenGL 3.x и выше рисует примитивы? - PullRequest
5 голосов
/ 15 октября 2011

Я должен нарисовать много примитивов с OpenGL (3.3, 4.2), я знал с glutSolidTeapot ();Я могу нарисовать примитив чайника с переизбытком.

Но, похоже, из этой команды не будет сгенерирован массив вершин, и я не знаю, являются ли такие команды устаревшими.

И я заметил, что многие современные учебные пособия по OpenGL просто загружают свои собственные примитивы и избегают просто использовать перенасыщение, они даже загружают простую геометрию из файла формата 3d-сетки.

Моя цель - просто нарисовать эти примитивы как можно быстрееКак можно больше. И используйте новый OpenGL как можно больше.

Так, как рисовать примитивы в современном OpenGL?

Ответы [ 2 ]

8 голосов
/ 15 октября 2011

Поскольку GLUT (который не является частью OpenGL в любом случае) рисует свои примитивы, используя немедленный режим glBegin/glEnd и используя устаревшие встроенные атрибуты фиксированной функции, вы не сможете использовать этибольше, если вы хотите сконцентрироваться на устаревшей, современной функциональности ядра.

Вместо использования встроенных атрибутов (таких как glVertex, glNormal, ...) вы должны использовать свою собственную универсальную вершину.атрибуты (в сочетании с соответствующим вершинным шейдером, конечно) и вместо glBegin/glEnd вызовов вы должны рисовать примитивы, используя массивы вершин, передаваемые VBO и рисуемые с использованием glDrawArrays/glDrawElements и их производных.

Тогда как ничто не мешаетВы не можете хранить данные вершин для этих объектов в качестве переменных в исходном коде или генерировать их вручную, загружая их из файлов - это самый простой и общий способ, по крайней мере, для таких довольно сложных объектов, как чайник в Юте. Wavefront OBJ формат - это довольно простой формат файла сетки на основе ASCII, который довольно прост для чтения и может стать отправной точкой для изучения, поскольку его можно экспортировать практически любым программным обеспечением для моделирования.

2 голосов
/ 15 октября 2011

Рендеринг с новыми (не устаревшими) стандартами OpenGL выполняется исключительно с использованием шейдеров.

Атрибут шейдера может быть только буферными объектами.

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

...