Estou tentando fazer com que esse sombreador seja executado em um iDevice realmente antigo, bem como eventualmente em Androids.
Mesmo quando reduzo o código para 2 funções senoidais por fragmento, o sombreador é executado a cerca de 20fps.
Eu considerei tirar uma folha do livro de técnicas antigas de sombreamento e criar uma matriz que contém vários valores trigonométricos predefinidos e, de alguma forma, usá-los para aproximar o sombreador.
No shader que vinculei acima, já estou simulando que, arredondando os valores enviados para a função trigonométrica, quanto mais à esquerda o mouse (enquanto estiver pressionado), menor a qualidade do shader. Na verdade, é bem legal porque, bem perto do lado esquerdo, parece um sombreador completamente diferente e bem legal.
Enfim, tenho dois dilemas:
- Não sei qual é a maneira mais eficiente de ter uma matriz de 360 valores em um sombreador GLSL, constante ou uniforme?
Não consigo descobrir como colocar um número em um intervalo, como geralmente se quisesse um ângulo entre 0 e 360 (sim, eu sei que as GPUs usam radianos).
func range(float angle) { float temp = angle while (temp > 360) {temp -= 360;} while (temp < 0) {temp += 360;} return temp; }
No entanto, o GLSL não permite loops while ou funções recursivas.
mod
função interna é o que você deseja. Você escreveria mod(angle, 360.0)
.