¿Debo usar una matriz mundial?


8

Referencia de imagen para la pregunta:

espacio objeto vs espacio mundial

(imagen del tutorial de CG )

La API D3D9 nos acostumbró a las matrices mundiales .

Sin embargo, si usa matrices mundiales, entonces debe hacer una matriz adicional multiplicada en el sombreador (que termina siendo la misma para muchos vértices).

De ahí la convención de OpenGL de concatenar las matrices de modelado y visualización en una matriz (GL_MODELVIEWMATRIX = View * World).

¿Qué es mejor y por qué?

Respuestas:


7

No. En ningún momento deberías tener un matriz mundial explícita en tu sombreador.

Una explicación detallada de por qué aquí , pero la versión corta es realmente muy simple: nunca la necesita y puede matar su precisión de punto flotante.

Si su espacio mundial es demasiado grande, entonces una cámara que está lejos del origen puede causar problemas de precisión de coma flotante.

Todo el espacio mundial no es más que un intermediario entre el espacio modelo y el espacio de la cámara. Es un lugar donde puedes expresar la cámara y todos los demás objetos en el mismo espacio. Pero para todo lo que usa es para generar una matriz de mundo a cámara, que luego aplica a todas las matrices de modelo a mundo para crear matrices de modelo a cámara.

Puede lidiar con problemas de precisión en C ++ mediante el uso de dobles en lugar de flotantes para los cálculos matriciales. Puede convertirlos nuevamente en flotantes antes de cargarlos en el sombreador.

Entonces, ¿por qué necesitarías una transformación explícita del mundo-espacio en tu sombreador? En su código fuente, sí. ¿Pero en tu sombreador? ¿Qué harías con él que no puedes hacer con el espacio de la cámara?

La iluminación se puede hacer en el espacio de la cámara tan fácilmente como el espacio mundial; todo lo que tiene que hacer es transformar sus posiciones / direcciones de luz en el espacio de la cámara. Después de todo, el espacio de la cámara tiene la misma escala que el espacio mundial. Haces esta transformación una vez por cuadro por luz; apenas una carga de rendimiento incluso en la CPU.

Por lo tanto, no tiene ningún sentido exponer sus sombreadores a una transformación explícita del espacio mundial. Es solo un paso intermedio que se pliega en sus matrices.


1

No harías multiplicar la matriz extra en tu sombreador. El truco es que hagas tu multiplicación de matriz una vez por fotograma en la CPU, luego subas el resultado final a tu sombreador de vértices. Eso le da una posición por multiplicación de matriz por vértice, independientemente de si tiene un mundo y una vista separados o concatenados.


0

En muchos casos, desea tener el mundo pos en el sombreador de vértices de todos modos, para otros fines. Por ejemplo, necesita calcular el vector de vista, para pasar al sombreador de píxeles para evaluar especular.

La matriz local a mundo también es necesaria para transformar los vectores tangentes y los vectores normales [1] en el espacio mundial para sombrear, suponiendo que sombree en el espacio mundial (puede hacerlo en el espacio tangente, en cuyo caso necesitaría un conjunto diferente de matrices).

Entonces, en mi opinión, tiene sentido tener dos matrices: local a mundo y mundo a clip. Este último es el producto de la matriz de vista y la matriz de proyección. Pase ambos al sombreador de vértices y haga las multiplicaciones como:

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

[1] (Siempre que no tenga una escala no uniforme. En ese caso, las normales deben transformarse mediante la transposición inversa de la matriz local al mundo).



@NicolBolas: Buen punto; Hay problemas de precisión con el sombreado en el espacio mundial. No significa que tenga que usar el espacio de la cámara. En mi trabajo, en realidad utilizamos un "espacio mundial centrado en la cámara": ejes alineados con el mundo, origen en la cámara. Tener ejes alineados con el mundo facilita la aplicación de mapas de cubos almacenados en el espacio mundial.
Nathan Reed
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.