Como os fornecedores de drivers de GPU geralmente não se preocupam em implementar noiseX
no GLSL, estou procurando um conjunto de funções de utilitário "faca de exército suíço de randomização gráfica" , de preferência otimizado para uso em shaders de GPU. Eu prefiro o GLSL, mas o código que qualquer idioma fará por mim, estou bem em traduzi-lo sozinho para o GLSL.
Especificamente, eu esperaria:
a) Funções pseudo-aleatórias - N-dimensional, distribuição uniforme acima de [-1,1] ou acima de [0,1], calculada a partir da semente dimensional M (idealmente qualquer valor, mas não tenho problema em restringir a semente digamos 0..1 para distribuição uniforme de resultados). Algo como:
float random (T seed);
vec2 random2 (T seed);
vec3 random3 (T seed);
vec4 random4 (T seed);
// T being either float, vec2, vec3, vec4 - ideally.
b) Ruído contínuo como Perlin Noise - novamente, distribuição N-dimensional, + - uniforme, com conjunto restrito de valores e, bem, com boa aparência (algumas opções para configurar a aparência como níveis de Perlin também podem ser úteis). Eu esperaria assinaturas como:
float noise (T coord, TT seed);
vec2 noise2 (T coord, TT seed);
// ...
Eu não sou muito fã da teoria da geração de números aleatórios, então eu gostaria muito de encontrar uma solução pré-fabricada , mas também gostaria de respostas como "aqui está uma 1D rand () muito boa e eficiente () e deixe-me explicar você como fazer um bom rand N-dimensional () em cima dele ... " .
vec2 co
? é o alcance? semente?co.xy
é usado, em vez deco
?Ocorre-me que você poderia usar uma função hash inteira simples e inserir o resultado na mantissa de um flutuador. IIRC, a especificação GLSL garante números inteiros não assinados de 32 bits e representação flutuante IEEE binary32, portanto deve ser perfeitamente portátil.
Eu tentei agora. Os resultados são muito bons: parece exatamente estático em todas as entradas que tentei, sem padrões visíveis. Em contraste, o trecho popular de sin / fract tem linhas diagonais bastante pronunciadas na minha GPU, com as mesmas informações.
Uma desvantagem é que requer o GLSL v3.30. E, embora pareça rápido o suficiente, não quantifiquei empiricamente seu desempenho. O Shader Analyzer da AMD reivindica 13,33 pixels por relógio para a versão vec2 em um HD5870. Compare com 16 pixels por relógio para o snippet sin / fract. Portanto, é certamente um pouco mais lento.
Aqui está a minha implementação. Deixei em várias permutações da idéia para facilitar a derivação de suas próprias funções.
Captura de tela:
Inspecionei a captura de tela em um programa de edição de imagens. Existem 256 cores e o valor médio é 127, o que significa que a distribuição é uniforme e cobre o intervalo esperado.
fonte
Não, não desde 2005. É só que as pessoas insistem em baixar a versão antiga. A versão que está no link que você forneceu usa apenas texturas 2D de 8 bits.
A nova versão de Ian McEwan, do Ashima e de mim, não usa uma textura, mas roda em torno da metade da velocidade em plataformas de desktop típicas com muita largura de banda de textura. Nas plataformas móveis, a versão sem textura pode ser mais rápida, porque a textura costuma ser um gargalo significativo.
Nosso repositório de origem mantido ativamente é:
https://github.com/ashima/webgl-noise
Uma coleção das versões de ruído sem textura e com textura está aqui (usando apenas texturas 2D):
http://www.itn.liu.se/~stegu/simplexnoise/GLSL-noise-vs-noise.zip
Se você tiver alguma dúvida específica, sinta-se à vontade para me enviar um e-mail diretamente (meu endereço de e-mail pode ser encontrado nas
classicnoise*.glsl
fontes).fonte
glBindTexture(GL_TEXTURE_1D, *texID);
etc. Não está claro o que você quer dizer com "o link que você forneceu", pois você cita minha resposta mas essa resposta não estava vinculada à sua implementação. Atualizarei minha resposta para esclarecer a que me refiro e refletir as novas informações que você forneceu. Caracterizar as pessoas como "insistentes" no download da versão antiga é uma distorção que você não acredita.Ruído de ouro
Veja Gold Noise no seu navegador agora mesmo!
Essa função melhorou a distribuição aleatória da função atual na resposta @appas em 9 de setembro de 2017:
A função @appas também está incompleta, pois não há semente fornecida (uv não é uma semente - o mesmo para todos os quadros) e não funciona com chipsets de baixa precisão. O Gold Noise é executado com baixa precisão por padrão (muito mais rápido).
fonte
Também existe uma boa implementação descrita aqui por McEwan e @StefanGustavson que parece com o ruído Perlin, mas "não requer nenhuma configuração, ou seja, não texturas nem matrizes uniformes. Basta adicioná-lo ao código-fonte do shader e chamá-lo onde quiser".
Isso é muito útil, especialmente considerando que a implementação anterior de Gustavson, à qual @dep se vinculou, usa uma textura 1D, que não é suportada no GLSL ES (a linguagem shader do WebGL).
fonte
Use isto:
Não use isso:
Você pode encontrar a explicação em Melhorias no GLSL canônico de uma linha rand () para OpenGL ES 2.0
fonte
mod
uma aproximação de pi?Acabei de encontrar esta versão do ruído 3D para GPU, supostamente é a mais rápida disponível:
fonte
Uma versão reta e irregular do 1d Perlin, essencialmente um zigue-zague aleatório do lfo.
Eu também encontrei o 1-2-3-4d ruído perlin no site do tutorial do proprietário shadertoy, inigo quilez perlin, e voronoi e assim por diante, ele tem implementações e códigos rápidos completos para eles.
fonte
hash: Atualmente, o webGL2.0 existe, portanto, números inteiros estão disponíveis no (w) GLSL. -> para hash portátil de qualidade (a um custo semelhante ao dos feixes flutuantes feios), agora podemos usar técnicas de hash "sérias". O QI implementou alguns em https://www.shadertoy.com/view/XlXcW4 (e mais)
Por exemplo:
fonte
Veja abaixo um exemplo de como adicionar ruído branco à textura renderizada. A solução é usar duas texturas: ruído branco puro e original, como este: ruído branco wiki
O fragmento compartilhado contém o parâmetro uNoiseFactor, que é atualizado a cada renderização pelo aplicativo principal:
fonte
Traduzi uma das implementações Java de Ken Perlin para GLSL e a usei em alguns projetos no ShaderToy.
Abaixo está a interpretação GLSL que fiz:
Traduzi-o do Apêndice B do Capítulo 2 do Noise Hardware de Ken Perlin nesta fonte:
https://www.csee.umbc.edu/~olano/s2002c36/ch02.pdf
Aqui está uma sombra pública que fiz no Shader Toy que usa a função de ruído publicada:
https://www.shadertoy.com/view/3slXzM
Algumas outras boas fontes que encontrei sobre o ruído durante minha pesquisa incluem:
https://thebookofshaders.com/11/
https://mzucker.github.io/html/perlin-noise-math-faq.html
https://rmarcus.info/blog/2018/03/04/perlin-noise.html
http://flafla2.github.io/2014/08/09/perlinnoise.html
https://mrl.nyu.edu/~perlin/noise/
https://rmarcus.info/blog/assets/perlin/perlin_paper.pdf
https://developer.nvidia.com/gpugems/GPUGems/gpugems_ch05.html
Eu recomendo o livro de shaders, pois ele não apenas fornece uma ótima explicação interativa do ruído, mas também outros conceitos de shader.
EDITAR:
Talvez seja possível otimizar o código traduzido usando algumas das funções aceleradas por hardware disponíveis no GLSL. Atualizará este post se eu acabar fazendo isso.
fonte