A pergunta imediata é: no HLSL, como posso orientar uma superfície normal gerada no espaço UV para poder aplicá-la a uma face de cubo?
O projeto geral é que estou tentando construir um gerador de planeta procedural. Estou usando um cubo projetado para uma esfera em que cada face é um quad-tree. O projeto intermediário é que eu quero gerar um mapa normal para o terreno. Acho que a melhor maneira de fazer isso (e entender o que estou fazendo) é gerar primeiro os normais para a versão do cubo e depois trabalhar as transformações para deformar esses normais na esfera.
Idealmente, o método não envolveria código de ramificação com base na face em que estou trabalhando (ou seja, se estamos no lado superior do cubo, então U = X e V = Y). Em outras palavras, o que eu estou esperando é um pouco de magia matemática como "Oh, basta cruzar o terreno normal pelo produto escalar do cubo com a face normal e blá blá blá".
20/09/10 ETA:
Eu sei como calcular normais para uma superfície plana. Meu problema subsequente é duplo:
- Como eu giro o mapa normal para que ele seja orientado corretamente em cada uma das faces do cubo?
- como distorço o mapa normal plano para envolver a esfera?
Encontrei uma solução que usa uma matriz jacobiana, mas não consigo fazê-la funcionar. Mesmo quando todas as normais estão apontando para cima (ou seja, uma superfície plana), o código HLSL envolvendo o jacobiano atrapalha totalmente a iluminação - então isso não me faz confiar na minha implementação da solução.
Respostas:
Suas normais devem estar no espaço tangente, para que você possa aplicá-las em qualquer superfície para a qual possa criar um espaço tangente (trivial para esferas). Basicamente, o mapa normal descreve como o normal difere do normal real em um pequeno pedaço no superfície. O espaço tangente é o que você provavelmente tenta obter com sua matriz jacobiana - para uma esfera, você pode criar um sistema de coordenadas do espaço tangente em qualquer ponto, usando o normal no ponto e dois vetores perpendiculares - apenas oriente-os consistentemente ( por exemplo, ao longo de você ev) e pronto. Você pode então converter seu vetor de luz recebido no espaço tangente (ou vice-versa) e iluminar com o novo normal. A vantagem é que seu mapa normal funcionará em qualquer objeto com um espaço tangente definido e mapeamento UV.
No cubo, seu espaço tangente para cada face é simplesmente o próprio rosto (ou seja, se você tem uma face com um -Z normal, por exemplo, e seu espaço tangente acima é + Y, basta girar esse normal usando uma matriz que mapeia -Z a + Y.)
fonte
"Eu sei como calcular valores normais para uma superfície plana." Exatamente como você está fazendo isso? Tanto quanto eu sei, você não deveria ter que fazer nada para mapeá-lo para uma esfera que não seja mapear corretamente seus UVs para a superfície da esfera. Os mapas normais estão sempre em um plano "plano" porque a textura em si é "plana". A forma do objeto ao qual você aplica o mapa normal não deve importar.
fonte