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.
fonte
mod
função interna é o que você deseja. Você escreveriamod(angle, 360.0)
.Respostas:
GL_REPEAT
como modo de quebra automática para a textura e ela será iniciada automaticamente novamente no início ao acessar com argumentos> 1 (e da mesma forma para argumentos negativos).GL_LINEAR
como filtro de textura, dessa forma obtendo valores que você nem mesmo armazenou. É claro que a interpolação linear não é 100% precisa para funções trigonométricas, mas certamente é melhor do que nenhuma interpolação.float sin = 2.0 * (texValue.r + texValue.g / 256.0) - 1.0;
(ou ainda mais componentes para grãos mais finos). Isso permite que você lucre com texturas de vários componentes novamente.É claro que ainda precisa ser avaliado se essa é uma solução melhor, pois o acesso à textura também não é totalmente gratuito, e também qual seria a melhor combinação de tamanho e formato da textura.
Para preencher a textura com dados e endereçar um de seus comentários, você deve considerar que a filtragem de textura retorna o valor exato no centro texel , ou seja, uma coordenada de textura reduzida pela metade do tamanho texel. Então, sim, você deve gerar valores em
.5
texels , ou seja, algo parecido com isto no código do aplicativo:uniform float sinTable[361]
glUniform1fv
mod
fonte