Подтвердить что ты не робот

GLKit GLKBaseEffect и пользовательские шейдеры

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

В основном я работал над проектом iPhone некоторое время, когда у меня есть роскошь использовать все новейшие фреймворки и цель 5.1. Поэтому я использовал GLKit и GLKBaseEffect, которые работают для меня отлично. Причина, по которой я начинал с GLKBaseEffect, а не писал свои собственные шейдеры, - это то, что я плохо знаю glsl. Однако требования стали более точными, и базовый эффект, похоже, больше не сокращает его.

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

Мой старый подход выглядит примерно так (это в цикле, отображающем все объекты, где объект содержит такие вещи, как преобразования, сетку и некоторые другие менее важные вещи для этой проблемы, такие как текстуры, материалы и т.д.),

ObjectBase *obj = [ResourceManager.shared getObjectNamed:name inScene:sceneName];
GLKMatrix4 modelview = effect.transform.modelviewMatrix;
effect.transform.modelviewMatrix = GLKMatrix4Multiply(effect.transform.modelviewMatrix, obj.transform);

[effect prepareToDraw];
[obj render];

effect.transform.modelviewMatrix = modelView;

Здесь мы извлекаем объект для рендеринга и преобразования (т.е. перевод, поворот и масштабирование) объекта, который мы его визуализируем, где сам рендеринг выбирает сетку для объекта, связывает буферы и визуализирует его.

Пока все хорошо.

Однако мне хотелось бы, чтобы во время вызова [obj render]; я хотел бы, чтобы объект также делал что-то вроде glUseProgram(someProgram);, добавляя более специализированный шейдерный код.

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

Я кое-что пробовал.

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

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

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

4b9b3361

Ответ 1

Как вы обнаружили, вы не можете просто использовать шейдер фрагмента и оставить за собой вершинный шейдер. Это связано с тем, что у обоих есть разные задачи. Вершинные шейдеры имеют дело с per-vertex аспектами: вычисляют данные вершин, текстуру (uv) и т.д. И, наконец, рисуют грани (треугольники). Фрагментные шейдеры имеют дело с тем, что именно будет отображаться на каждом пикселе на экране (или в окне просмотра). Когда вы предоставляете только фрагментарный шейдер, вы не рассказываете, что представляют ваши данные вершин, а вы только сообщаете OpenGL что-то делать с пикселями. И эти пиксели ничего не содержат /gibberish (я не уверен, какой), поскольку ваш вершинный шейдер ничего не сделал.

При использовании GLKEffect вызов метода [yourEffect prepareToDraw] обеспечивает шейдеры и т.д.

Если вы просто хотите использовать пару запасных шейдеров, почему бы не использовать тот, который указан в шаблоне игры XCode OpenGL? Когда вы запускаете его, он имеет два куба, один из которых отображается с помощью GLKit, а другой - обычный. Хотя я думаю, что этого не будет достаточно для большинства эффектов. Если вы хотите узнать больше о шейдерах, вы можете взглянуть на NeHe введение GLSL article. Речь идет о GLSL и о том, как вы можете писать и использовать шейдеры в вашем коде. Возможно, вам стоит взглянуть на Diney Bomfim Все о шейдерах статьи и страница.

Использование GLKit в большинстве случаев является приятным, так как оно избавляет вас от записи большого количества бесполезного повторяющегося кода. Например, вам не нужно проходить столько форматов изображений с разными цветовыми кодировками и битами на пиксель (для каждого формата), и все, когда вы можете просто использовать GLKTextureLoader.

Ответ 2

Я просто хотел дать свои выводы тем, кто их интересует.

То, что я сделал, фактически выбрасывает GLBaseEffect и реализует собственный шейдерный код.

Моя самая большая проблема заключалась в том, что я действительно не понимал, что все это или ничего не говоря.

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

То, что я узнал во время моих усилий, - это пара ключевых моментов:

  • GLKBaseEffect предназначен для имитации конвейера с фиксированной функцией, как показано в более ранних версиях OpenGLES. Следовательно, он обертывает общий шейдерный код, поэтому вам не нужно много об этом заботиться. У вас будет базовая функциональность, но она не очень расширяема.
  • Вы все еще можете использовать опрятные функции GLKit, такие как загрузчик текстур, математическая библиотека и т.д., если вы пишете свой собственный шейдерный код. Поэтому, если вам нужно что-то более сложное или настраиваемое (отображение рельефа, тонирование и т.д.), Стоит полностью переписать код котельной пластины, необходимый для правильной визуализации. Первое, что я сделал, это то, что я использовал GLKBaseEffect для ориентации на сцене, поскольку он довольно удобен и прост в использовании. Однако, когда я хотел сделать больше (нормальное отображение касательного пространства), я как бы застрял, так как не смог добавить к шейдерной программе, обработанной GLKBaseEffect.
  • Шейдеры действительно не так страшны, как я всегда думал! Я просто понятия не имел, что это на самом деле означает, и я удивлен, что я так много читал о них и до сих пор не понял, что в основном шейдеры - это программы, ЗАМЕНЯЮЩИЕ конвейер фиксированной функциональности. Просто как это.

Я достаточно догадываюсь, просто хотел проследить и добавить какие кусочки я собрал так далеко.