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

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

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

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

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

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

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

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

12
задан Slipp D. Thompson 15 October 2015 в 06:40
поделиться