Como posso gerar ruído processual em uma esfera?

15

Eu gostaria de gerar ruído processual na superfície de uma esfera (por exemplo, gerar processualmente planetas ou bolas com textura de mármore). Obviamente, eu poderia pegar um algoritmo de ruído padrão e mapeá-lo na esfera, mas isso tem todos os problemas de projetar um avião em uma esfera, como distorções nos polos ou em qualquer outro lugar.

Suponho que poderia gerar ruído de volume e "cortar" a esfera, mas isso parece desnecessariamente ineficiente - e se o ruído tiver alguns artefatos baseados em grade, eles ainda não apareceriam uniformemente na esfera. Além disso, pelo menos no caso do ruído Simplex, cortar fatias 2D do ruído 3D geralmente parece diferente do que gerar ruído 2D imediatamente.

Existe alguma maneira de evitar esses problemas, por exemplo, gerando ruído nativamente na esfera? O ruído deve ter pelo menos a qualidade do ruído Perlin , idealmente o ruído Simplex .

Martin Ender
fonte
Talvez projeção triplanar, como visto na GPU Gems 3 ? A questão é se o ruído pareceria embaçado ou indesejável quando estiver se misturando entre diferentes projeções.
Re
Eu adicionei outro método possível para o meu post. Pode valer a pena esclarecer sua pergunta com requisitos mais detalhados. ou seja, por que uma fatia 2D de ruído 3D não atende aos seus requisitos visuais? Quais são os seus requisitos de desempenho?
John Calsbeek
@JohnCalsbeek Honestamente, não tenho nenhum requisito difícil em mãos. Esta era apenas uma pergunta que eu estava curiosa sobre a qual pensei em tentar a versão beta privada. Obviamente, cortar uma fatia 2D do ruído 3D será suficiente para muitas aplicações, mas tenho certeza de que terá algum impacto no desempenho e anisotropias (que podem ou não ser perceptíveis). "Cortar a esfera do ruído 3D é sua melhor opção, porque ..." é definitivamente uma resposta válida.
Martin Ender
Você pode conferir este shadertoy que faz barulho em uma esfera: shadertoy.com/view/4sfGzS #
Alan Wolfe

Respostas:

15

Eu consideraria apenas ir com o ruído 3D e avaliá-lo na superfície da esfera.

Para ruído de gradiente que está naturalmente no domínio da superfície da esfera, é necessário um padrão regular de pontos de amostra na superfície que possuam informações de conectividade natural, com área aproximadamente igual em cada célula, para que você possa interpolar ou somar valores adjacentes. Gostaria de saber se algo como uma grade de Fibonacci pode funcionar:

Grade de Fibonacci na superfície de uma esfera

Não analisei a matemática para determinar quanto trabalho seria descobrir os índices e a distância de seus quatro vizinhos (nem sei se você acaba tendo quatro vizinhos bem definidos em todos os casos), e suspeito que possa ser menos eficiente do que simplesmente usar ruído 3D.

Edit: Alguém mais mastigou a matemática! Veja este novo artigo sobre Mapeamento de Fibonacci Esférico . Parece que seria fácil adaptá-lo ao ruído da esfera.


Se você estiver renderizando uma esfera, não apenas avaliando o ruído na superfície de uma esfera, e está bem em classificar sua esfera com a resolução da sua estrutura de ruído, é possível criar uma grade geodésica na superfície da esfera (um icosaedro subdividido, usualmente):

Esfera geodésica

Cada vértice da esfera pode ter um gradiente gerado aleatoriamente para ruído de gradiente. Para obter essas informações no sombreador de pixels (a menos que você queira uma interpolação direta como ruído de valor), você pode precisar de uma técnica como a renderização em estrutura de arame deste artigo com coordenadas baricêntricas : faça renderização não indexada, com cada vértice que contém as coordenadas bentêntricas desse vértice no triângulo . Você pode então ler SV_PrimitiveID(ou o equivalente do OpenGL) no sombreador de pixels, ler os três gradientes de ruído dos vértices com base em qual triângulo você está e usar o cálculo de ruído que desejar usando as coordenadas barricêntricas interpoladas.

Acho que a parte mais difícil desse método é criar um esquema para mapear sua identificação do triângulo para três amostras, a fim de procurar os valores de ruído em cada vértice.

Se você precisar de várias oitavas de ruído ou ruído em uma resolução mais fina que o modelo de esfera, poderá criar uma grade geodésica grossa com vértices e fazer alguns níveis de subdivisão no sombreador de pixels. ou seja, a partir das coordenadas baricêntricas, descubra em que triângulo subdividido você estaria se a malha fosse ainda mais com mosaicos e, em seguida, descubra qual seria o ID primitivo e as coordenadas barricêntricas desse triângulo.

John Calsbeek
fonte
2
Eu nunca tinha ouvido falar de redes de Fibonacci antes; Isso é bem legal!
Nathan Reed
Esse é um artigo fascinante. Parece que você pode ajustar os parâmetros para aproximar-se de uma grade quadrada ou hexagonal, o que permitiria abordagens diferentes para a geração de ruído.
Trichoplax
Tive alguns resultados não ruins interpolando perto das bordas do bloco, mas isso depende do efeito que você está tentando obter e dos parâmetros de ruído exatos. Funciona muito bem para ruídos um tanto embaçados, não tão bons com ruídos pontiagudos / finos.