Я работаю над посылочным шейдером GLSL (ES) для 2D-ударных волн. Легко исказить текстуру немного по кругу, и она уже работает для одиночных ударных волн. Теперь мне нужна поддержка нескольких волн в одно и то же время. Мои идеи:Динамический объем работы в шейдере фрагмента GLSL
1-я идея: Выполнение постобработки (привязка FBO -> привязка предыдущей текстуры -> вызов рисования) для каждой волны. Легкая реализация, но много изменений состояния и привлечения вызовов.
вторая идея: Добавить текстуру данных со всей информацией для всех волн и одной форме с числом волн, так что я могу сделать что-то вроде этого:
uniform int count;
uniform sampler2D dataTex;
const float dataTexSize = 32;
[...]
vec4 pixel;
for(int i = 0; i < count; i++)
{
vec2 dataTexPos = vec2(i/dataTexSize, 0);
pixel += shockwave(texture2D(dataTex, dataTexPos));
}
pixel /= float(count);
[...]
Но, видимо, графические процессоры не нравятся петли с непостоянным выражением, и драйвер не может развернуть.
Есть ли лучшая практика, чтобы дать шейдерам «динамическое количество работы»? Моя версия OpenGL 2.0 ES.
Вы можете попробовать выполнить профилирование обеих реализаций на любом оборудовании, к которому у вас есть доступ. –
Проблема в том, что вторая идея вообще не работает, потому что я не могу скомпилировать шейдер с циклом for для не константы. Я хотел бы знать, есть ли способ сделать это. –
"* Но, по-видимому, графические процессоры не любят циклы с не постоянным выражением *« Нет, * crappy * GPU не нравится. ES 2.0 не допускает непостоянного цикла, но на самом деле современные графические процессоры отлично справляются с этим. Desktop GL 3.0 отбросил такие требования почти десять лет назад. В мобильном пространстве GL ES 3.0 отбросила эти требования. –