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 .
fonte
Respostas:
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:
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):
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.
fonte