Я изучаю эту проблему, я имею, и я не могу понять ее достаточно хорошо, чтобы решить ее, поэтому я подумал, что могу ее выбросить, а интеллектуальная группа может иметь некоторые идеи.: 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
, однако он сказал, что при настройке и компиляции мне нужен один вершинный и один фрагментарный шейдер. Я также пытался создать пустой вершинный шейдер, который не получился очень хорошо, я не знаю, что с этим происходит, но я предполагаю, что он перекрывает базовый эффект.
Я склоняюсь к, в конце концов, признаю, что, вероятно, лучше всего выбросить базовые эффекты и просто написать свои собственные шейдеры. Я просто чувствую, что много работы в окне, поэтому я хотел посмотреть, сколько я могу сэкономить.
Я понимаю, что мое понимание шейдеров - это та часть, которая дает мне больше всего проблем, поэтому, пожалуйста, будьте терпеливы с этим фактом.