Devo usar uma matriz mundial?

8

Referência de imagem para a pergunta:

espaço de objeto vs espaço do mundo

(imagem do tutorial de CG )

A API D3D9 nos acostumou às matrizes mundiais .

No entanto, se você usar matrizes do mundo, precisará fazer uma multiplicação extra da matriz no sombreador (que acaba sendo o mesmo para muitos vértices).

Daí a convenção OpenGL de concatenar as matrizes de modelagem e visualização em uma matriz (o GL_MODELVIEWMATRIX = View * World).

O que é melhor e por quê?

bobobobo
fonte

Respostas:

7

Não. Em nenhum momento você deve ter uma matriz mundial explícita em seu shader.

Uma explicação detalhada do porquê pode ser encontrada aqui , mas a versão curta é realmente muito simples: você nunca precisa dela e pode matar sua precisão de ponto flutuante.

Se o seu espaço no mundo for muito grande, uma câmera que esteja longe da origem poderá causar problemas de precisão de ponto flutuante.

Todo o espaço do mundo é nada mais que um intermediário entre o espaço do modelo e o espaço da câmera. É um lugar onde você pode expressar a câmera e todos os outros objetos no mesmo espaço. Mas tudo o que você usa para gerar uma matriz de mundo para câmera, que você aplica a todas as matrizes de modelo para mundo para criar matrizes de modelo para câmera.

Você pode lidar com problemas de precisão em C ++ usando dobras em vez de flutuadores para cálculos de matriz. Você pode convertê-los novamente em carros alegóricos antes de carregá-los no sombreador.

Então, por que você precisaria de uma transformação explícita no espaço mundial em seu shader? No seu código fonte, sim. Mas no seu shader? O que você faria com isso e não pode fazer com o espaço da câmera?

A iluminação pode ser feita no espaço da câmera tão facilmente quanto no espaço do mundo; tudo o que você precisa fazer é transformar suas posições / direções de luz no espaço da câmera. Afinal, o espaço da câmera tem a mesma escala que o espaço do mundo. Você faz essa transformação uma vez por quadro por luz; dificilmente um fardo de desempenho, mesmo na CPU.

Portanto, não há absolutamente nenhum sentido em expor seus shaders a uma transformação explícita no espaço mundial. É apenas um passo intermediário que você dobra em suas matrizes.

Nicol Bolas
fonte
1

Você não faria a matriz extra se multiplicar no seu sombreador. O truque é que você faça a multiplicação da matriz uma vez por quadro na CPU e faça o upload do resultado final no seu shader de vértice. Isso fornece uma posição por multiplicação de matriz por vértice, independentemente de você ter mundo e visão separada ou concatenada.

Maximus Minimus
fonte
0

Em muitos casos, você deseja que o mundo seja posicionado no sombreador de vértices de qualquer maneira, para outros fins. Por exemplo, você precisa calcular o vetor de visualização, passar para o pixel shader para avaliar especular.

A matriz local para o mundo também é necessária para transformar vetores tangentes e vetores normais [1] em espaço do mundo para sombreamento, supondo que você faça sombreamento no espaço do mundo (você pode fazê-lo no espaço tangente (nesse caso, você deve um conjunto diferente de matrizes).

Portanto, na IMO, faz sentido ter duas matrizes: local para mundo e mundo para clipe. Este último é o produto da matriz de vistas e da matriz de projeção. Passe ambos para o vertex shader e faça as multiplicações como:

posWorld = mul(posLocal, matLocalToWorld)
posClip = mul(posWorld, matWorldToClip)

[1] (Contanto que você não tenha escala não uniforme. Nesse caso, os normais devem ser transformados pela transposição inversa da matriz local para o mundo.)

Nathan Reed
fonte
-1: o espaço do mundo é ruim. Muito mal; você não deve usá-lo em shaders
Nicol Bolas
@ NicolBolas: Bom ponto; há problemas de precisão com sombreamento no espaço do mundo. Não significa que você precise usar o espaço da câmera. No meu trabalho, na verdade, usamos um "espaço mundial centrado na câmera" - eixos alinhados com o mundo, origem na câmera. Ter eixos alinhados ao mundo facilita a aplicação de mapas de cubo armazenados no espaço do mundo.
Re