Я пытаюсь заставить этот шейдер работать на действительно старом iDevice, а также на Android.
Даже когда я уменьшаю код до 2 синусоидальных функций на фрагмент, шейдер работает со скоростью около 20 кадров в секунду.
Я подумал о том, чтобы взять лист из книги старых методов шейдинга и создать массив, который содержит набор предопределенных значений триггеров и каким-то образом использовать их для аппроксимации шейдера.
В шейдере, с которым я связан выше, я уже симулирую, что, округляя значения, отправленные в функцию триггера, чем дальше левая мышь (при нажатии), тем меньше качество шейдера. Это на самом деле довольно круто, потому что очень близко к левой стороне это выглядит как совершенно другой и довольно крутой шейдер.
Во всяком случае, у меня есть две дилеммы:
- Я не знаю, какой самый эффективный способ иметь массив из 360 значений в шейдере GLSL, постоянный или равномерный?
Я не могу понять, как поместить число в диапазон, как обычно, если бы я хотел угол между 0 и 360 (да, я знаю, что графические процессоры используют радианы), я бы сделал это так.
func range(float angle) { float temp = angle while (temp > 360) {temp -= 360;} while (temp < 0) {temp += 360;} return temp; }
Однако GLSL не допускает циклы while или рекурсивные функции.
mod
функция - то, что вы хотите. Вы бы написали mod(angle, 360.0)
.