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