2012-01-16 1 views
3

Ahoy!Соответствующее использование GLKBaseEffect

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

В GLKBaseEffect документации говорится:

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

То, что я пытаюсь различить;

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

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

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

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

+0

Неужели никто не использовал GLKBaseEffect достаточно широко, чтобы обеспечить понимание? Мне интересно получать прибыль за использование одного экземпляра или если требуется несколько экземпляров. Я напишу тестовое приложение и опубликую результаты для всех, кто может быть заинтересован. – CaptainRedmuff

ответ

5

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

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

Счастливый парусной ..

+1

Awesome. Я не думал, что подходы, которые я видел до сих пор, были совершенно правильными. Я начал писать тестовую сцену, и один экземпляр более чем способен. Спасибо за ваш ответ :) – CaptainRedmuff

4

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

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

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