Я сейчас вхожу в борьбу с OpenGL.Я начал с GLUT, но решил "перейти" на библиотеки SFML.SFML фактически предоставляет даже меньше утилит GL, чем GLUT, но является переносимым и предоставляет некоторые другие функции.Так что это действительно только я, GL и GLU.Да, я отстойник для наказания.
Я хотел бы спросить о стратегиях, которые люди используют для управления такими вещами, как изменения матрицы, изменения цвета, изменения материала и т. Д.
В настоящее время я выполняю рендеринг.из одного потока, следуя философии дизайна "Голые предметы".то есть.Каждый графический объект имеет функцию Render()
, которая выполняет работу по рисованию.Эти объекты сами могут быть совокупностями других объектов или совокупностями графических примитивов.Когда вызывается конкретный Render()
, у него нет информации о том, какие преобразования / материальные изменения были вызваны до него (это, конечно, хорошо).
По мере развития вещей я остановился на определенных стратегиях, таких как созданиекаждая функция обещает нажать и затем вытолкнуть матрицы, если они выполняют какие-либо преобразованияС другими настройками я явно устанавливаю все, что нужно настроить перед вызовом glBegin()
и ничего не принимаю как должное.Проблемы возникают, когда одна функция рендеринга вносит некоторые изменения в менее распространенные переменные состояния, и я начинаю рассматривать использование некоторого RAII для принудительного отмены всех изменений состояния, сделанных в области.Использование OpenGL иногда очень напоминает мне программирование на ассемблере.
Чтобы все это было управляемым и помогало с отладкой, я обнаружил, что практически разрабатываю свою собственную оболочку openGL, так что я подумал, что было бы полезно услышать остратегии, которые использовали другие, или мысли и соображения по этому вопросу.Или, может быть, пришло время переключиться на что-то вроде библиотеки графа сцены?
Обновление: 13/5/11
Теперь рассмотрим рендеринг с помощью вершины / нормального /Цветовые массивы и VBO Я решил объединить все фактические коммуникации OpenGL в отдельный модуль.Процесс рендеринга будет состоять из загрузки независимых от GL пространственных / материальных данных из моих объектов и последующей передачи всей этой информации в openGL в интерпретируемом формате.Это означает, что вся обработка необработанных массивов и состояний будет объединена в одну область.Это добавляет дополнительную косвенность и небольшие накладные расходы на процесс рендеринга, но это означает, что я могу использовать один VBO / массив для всех моих данных, а затем передавать все сразу, один раз за кадр в openGL.