Вопрос

Эй!

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

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

<цитата>

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

Что я пытаюсь понять:

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

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

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

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

Это было полезно?

Решение

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

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

Удачного плавания ...

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top