OpenGL рендер состояния управления - PullRequest
1 голос
/ 15 июля 2009

В настоящее время я работаю над небольшой игрой для iPhone и портирую 3D-движок, который начал разрабатывать для Mac, на iPhone. Все идет очень хорошо, и все функциональные возможности движка Mac теперь присутствуют на iPhone. Движок отнюдь не был закончен, но теперь, по крайней мере, у меня есть базовое управление ресурсами, граф сцены и конструкция, позволяющая легко анимировать и перемещать объекты.

Скриншот того, что у меня сейчас есть: http://emle.nl/forumpics/site/planes_grid.png. Маленький самолет - это тестовый объект, который я сделал несколько лет назад для игры, которую я делал тогда. Это не связано с игрой, которую я сейчас разрабатываю, но, конечно, 3D-движок и его возможности.

Теперь я перешел к теме материалов, описание которых текстуры, источники света и т. Д. Относятся к визуализируемому объекту. Это означает, что для каждого объекта требуется множество вызовов клиентского состояния OpenGL и glEnable / glDisable. Каким образом вы бы предложили минимизировать эти изменения состояния? В настоящее время я сортирую по материалам, поскольку объекты с одинаковым материалом вообще не нуждаются в каких-либо изменениях. Я создал класс с именем RenderState, который кэширует текущее состояние OpenGL и применяет только те элементы, которые отличаются, когда выбран другой материал. Это работоспособное решение, или оно выйдет из-под контроля, когда двигатель выйдет из строя, и все больше и больше состояний будет кэшироваться?

Ответы [ 2 ]

5 голосов
/ 19 июля 2009

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

3 голосов
/ 15 июля 2009

Если количество состояний в OpenGL ES выше, чем у стандартной версии, в какой-то момент будет сложно управлять.

Кроме того, если вы действительно хотите минимизировать изменения состояния, вам может понадобиться какая-то концепция сортировки состояний, чтобы рисованные объекты с похожими состояниями отображались вместе без необходимости большого количества элементов glEnable / glDisable между ними. Тем не менее, это может быть довольно сложно управлять даже на оборудовании ПК (представьте, что сортировка состояний выполняется по тысячам объектов), и слепое изменение состояния может быть на самом деле дешевле, в зависимости от реализации OpenGL.

Для сравнения вот подход, принятый OpenSceneGraph:

По сути, каждый узел в графе сцены имеет свой собственный набор состояний, в котором хранятся свойства материала, состояния и т. Д. Приятно то, что наборы состояний могут совместно использоваться несколькими узлами. Таким образом, бэкэнд рендеринга может просто отсортировать рисованные объекты по их указателям набора состояний (не содержимому набора состояний!) И визуализировать узлы с одним и тем же набором состояний вместе. Это предлагает хороший компромисс, поскольку бэкэнд не заботится об управлении отдельными состояниями opengl, но может достичь почти минимального изменения состояния, если генерируется соответствующий граф сцены.

То, что я предлагаю, в вашем случае состоит в том, что вы должны сделать много тестов, прежде чем придерживаться решения. Что бы вы ни делали, я уверен, что вам понадобится какая-то абстракция к состояниям OpenGL.

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