Самый практичный подход - это игнорировать большинство функций OpenGL, которые не применимо напрямую (или медленное, или не аппаратное ускорение, или уже не подходит для аппаратного обеспечения).
ООП или нет, чтобы сделать некоторые сцены тех, различные типы и объекты, которые вы обычно имеют:
Геометрия (сетки). Чаще всего это массив вершин и массив индексов (т. Е. Три индекса на треугольник, ака «список треугольников»). Вершина может быть в каком-то произвольном формате (например, только float3 position, float3 position + float3 normal, float3 position + float3 normal + float2 texcoord и т. Д. И т. Д.). Таким образом, чтобы определить часть геометрии вам нужно:
- определить это формат вершины (может быть битовой маска, перечисление из списка форматов; ...),
- имеет множество вершин, с их компонентами чередующиеся («чередующиеся массивы»)
- имеют массив треугольников.
Если вы находитесь в ООП-земле, вы можете назвать этот класс Сетка.
Материалов - вещи, которые определяют, как некоторая часть геометрии оказываются. В простейшем случае, например, это может быть цвет объекта. Или следует применять освещение. Или нужно ли альфа-смешивать объект. Или текстуру (или список текстур) для использования. Или использовать шейдер вершин/фрагментов. И так далее, возможности бесконечны. Начните с того, что вещи вам нужны в материалы. В области ООП этот класс можно назвать (сюрприз!) A Материал.
Сцена - у вас есть кусочки геометрии, коллекция материалов, время, чтобы определить, что находится на сцене. В простом случае каждый объект в сцене может быть определен: - Какую геометрию он использует (указатель на Mesh), - Как это должно быть визуализировано (указатель на материал), - Где он находится. Это может быть матрица преобразования 4x4 или матрица преобразования 4x3 или вектор (положение), кватернион (ориентация) и другой вектор (масштаб). Назовем это Узел в стране ООП.
Камера. Ну, камера - это не что иное, как «где она размещена» (опять же, матрица 4x4 или 4x3, позиция и ориентация), а также некоторые параметры проекции (поле зрения, соотношение сторон, ...).
Так что в принципе, это все! У вас есть сцена, которая представляет собой кучу узлов, которые ссылаются на Meshes and Materials, и у вас есть камера, определяющая, где находится зритель.
Теперь, когда нужно разместить фактические вызовы OpenGL, это вопрос дизайна. Я бы сказал, не ставьте вызовы OpenGL в классы Node или Mesh или Material. Вместо этого сделайте что-то вроде OpenGLRenderer, который может пересекать сцену и вызывать все вызовы. Или, что еще лучше, сделать что-то, что пересекает сцену, не зависящее от OpenGL, и поместить вызовы более низкого уровня в класс, зависящий от OpenGL.
Так что да, все вышеперечисленное в значительной степени независимо от платформы. Идя таким образом, вы обнаружите, что glRotate, glTranslate, gluLookAt и друзья совершенно бесполезны. У вас уже есть все матрицы, просто передайте их OpenGL. Вот как большинство из реального реального кода в реальных играх/приложениях работают в любом случае.
Конечно, вышеуказанное может быть осложнено более сложными требованиями. В частности, материалы могут быть довольно сложными. Мешам обычно необходимо поддерживать множество разных вершинных форматов (например, упакованные нормали для эффективности). Узлы сцен, возможно, должны быть организованы в иерархии (это может быть легко - просто добавьте указатели родителя/детей в узел). Охваченные сетки и анимации в целом добавляют сложность. И так далее.
Но основная идея проста: есть Геометрия, есть Материалы, есть объекты в сцене. Затем некоторые небольшие фрагменты кода могут их отображать.
В случае с OpenGL настройка сетки, скорее всего, создаст/активирует/изменяет объекты VBO. Прежде чем какой-либо узел будет визуализирован, необходимо будет установить матрицы. И настройка материала коснется большинства остальных состояний OpenGL (смешение, текстурирование, освещение, комбинаторы, шейдеры и т. Д.).
Ваша идея для класса mesh кажется мне очевидной :) То, что я пытался сделать, это использовать объекты для примитивов, таких как треугольники. Использование объектов для управления сетками дает больше смысла, поскольку они, как правило, достаточно самодостаточны, правильные? – fluffels 2008-10-04 20:20:44
Кроме того, большое спасибо за понимание материалов независимости платформы и деревьев рендеринга! Это очень помогает! – fluffels 2008-10-04 20:22:10
Я думаю, что это отличный ответ! ... Любой, кто начинает писать 3D-движок, должен основывать его на этих принципах. (Или еще лучше: используйте движок, который сделает все это для вас и сохранит значение времени) – fho 2010-11-03 15:33:56