Надлежащее использование GLKBaseEffect - PullRequest
3 голосов
/ 16 января 2012

Ahoy!

Я пытался обновить старый тестовый код, пытаясь освежить в памяти новые функции, добавленные в GLKit. До сих пор мне удалось настроить GLKViewController и начать рендеринг некоторых основных фигур, но я изо всех сил пытался найти какую-либо приличную информацию о GLKBaseEffect.

Документация GLKBaseEffect гласит:

Во время инициализации ваше приложение сначала создает контекст OpenGL ES 2.0 и делает его текущим. Затем он выделяет и инициализирует новый объект эффекта, настраивает его свойства и вызывает его метод prepareToDraw. Привязка эффекта приводит к компиляции шейдера и привязке к текущему контексту OpenGL ES. Базовый эффект также требует предоставления вершинных данных вашим приложением. Чтобы предоставить данные вершины, создайте один или несколько объектов массива вершин. Для каждого атрибута, требуемого шейдером, объект массива вершин должен включать атрибут и указывать на данные, хранящиеся в объекте буфера вершин.

Что я изо всех сил пытаюсь различить, так это;

Нужен ли мне объект GLKBaseEffect для каждой "модели", которую я рендерил? Или я использую один GLKBaseEffect для каждой "сцены" и просто изменяю свойства на лету перед вызовом prepareToDraw?

Я видел несколько учебных пособий для игровых движков и средств визуализации, которые просто используют один GLKBaseEffect для каждой модели, но это кажется совершенно неэффективным, если того же можно достичь с помощью одного экземпляра.

Из прочтения документации почти кажется, что это лучший подход, но, учитывая, что я видел очень много людей, использующих несколько экземпляров, я начинаю думать, что это не так.

Может кто-нибудь пролить свет на это? GLKit все еще довольно плохо знаком с iOS (и для меня), поэтому любая информация будет принята с благодарностью.

Ответы [ 2 ]

5 голосов
/ 23 января 2012

Нет, вы не должны создавать уникальный GLKBaseEffect для каждого объекта. Например, если вы рисуете лабиринт, каждый кирпич в этом лабиринте может быть своим собственным объектом, но все они могут иметь один и тот же GLKBaseEffect. Помните, однако, что GLKBaseEffect также хранит информацию о местоположении, а также текстуру, освещение, туман и т. Д. Поэтому, если вы хотите рисовать кирпичи в более чем одном месте (что, я полагаю, вы делаете :-), вы настраиваете их матрицу преобразования, а затем вызываете API «prepareToDraw».

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

Счастливого плавания ..

4 голосов
/ 14 февраля 2012

Каждое изменение «фундаментальных» свойств (lightingType, lightModelTwoSided, colorMaterialEnabled, ...) приведет к загрузке новой шейдерной программы при следующем вызове prepareToDraw.

Так что если вы неЕсли вы используете порядок рендеринга, то не имеет значения, используете ли вы один эффект для каждого визуализированного объекта или один изменяющийся эффект для всех объектов.В обоих случаях вы получите ненужный вызов glUseProgram и множество ненужных изменений состояния OpenGL для каждого нарисованного объекта.(используйте шаблон инструментов «OpenGL ES Analysis» для исследования сгенерированных вызовов OpenGL)

Тем не менее, вашим основным условием должно быть упорядочение объектов для рендеринга.По крайней мере, сгруппируйте все объекты, которые используют одну и ту же шейдерную программу.Затем создайте и используйте один объект GLKBaseEffect для каждой из этих групп.Если вы не уверены, что изменение свойства GLKBaseEffect приведет к загрузке новой шейдерной программы, я рекомендую использовать инструменты для исследования вызовов OpenGL.

...