¿Por qué sería beneficioso tener una matriz de proyección separada, pero combinar el modelo y la matriz de vista?


Cuando estás aprendiendo programación 3D, se te enseña que es más fácil pensar en términos de 3 matrices de transformación:

  1. La Matriz del Modelo . Esta matriz es individual para cada modelo y gira y escala el objeto como se desee y finalmente lo mueve a su posición final dentro de su mundo 3D. "The Model Matrix transforms model coordinates to world coordinates"(en inglés).

  2. La Matriz de vista . Esta matriz suele ser la misma para un gran número de objetos (si no para todos ellos) y gira y mueve todos los objetos de acuerdo con la "posición de la cámara"actual. Si imaginas que la escena 3D está filmada por una cámara y lo que se representa en la pantalla son las imágenes que fueron capturadas por esta cámara, la ubicación de la cámara y su dirección de visualización definen qué partes de la escena son visibles y cómo aparecen los objetos en la imagen capturada. Hay pocas razones para cambiar la matriz de vista mientras se renderiza una sola frame, pero esos sí existen de hecho (por ejemplo, renderizando la escena dos veces y cambiando la matriz de vista en el medio, puede crear un espejo muy simple, pero impresionante dentro de su escena). Por lo general, la matriz de vista cambia solo una vez entre dos fotogramas que se dibujan. "The View Matrix transforms world coordinates to eye coordinates" (en inglés).

  3. La Matriz De Proyección. La matriz de proyección decide cómo se asignan esas coordenadas 3D a coordenadas 2D, por ejemplo, si hay una perspectiva aplicado a ellos (los objetos se hacen más pequeños cuanto más lejos están del espectador) o no (proyección ortogonal). La matriz de proyección casi nunca cambia en absoluto. Es posible que tenga que cambiar si está renderizando en una ventana y el tamaño de la ventana ha cambiado o si está renderizando pantalla completa y la resolución ha cambiado, sin embargo, solo si el nuevo tamaño de ventana/resolución de pantalla tiene una relación de aspecto de visualización diferente a la anterior. Hay algunos efectos locos para que usted puede querer cambiar esta matriz pero en la mayoría de los casos es bastante constante para toda la vida de su programa. "The Projection Matrix transforms eye coordinates to screen coordinates"(en inglés).

Esto tiene mucho sentido para mí. Por supuesto, uno siempre podría combinar las tres matrices en una sola, ya que multiplicar un vector primero por matrix A y luego por matrix B es lo mismo que multiplicar el vector por matrix C, donde C = B * A.

Ahora si nos fijamos en el OpenGL clásico (OpenGL 1.x / 2.x), OpenGL conoce una matriz de proyección. Sin embargo, OpenGL no ofrece un modelo o una matriz de vista, solo ofrece una matriz combinada modelo-vista. ¿Por qué? Este diseño le obliga a guardar y restaurar permanentemente la "matriz de vista", ya que será "destruida" por las transformaciones del modelo aplicadas a ella. ¿Por qué no hay tres matrices separadas?

Si nos fijamos en las nuevas versiones de OpenGL (OpenGL 3.x / 4.x) y no usas la canalización de renderizado clásica, sino que personalizas todo con shaders (GLSL), ya no hay matrices disponibles, tienes que definir tus propias matrices. Sin embargo, la mayoría de la gente mantiene el viejo concepto de una matriz de proyección y una matriz de vista de modelo. ¿Por qué harías eso? ¿Por qué no usar tres matrices, lo que significa que no tiene que guardar y restaurar permanentemente la matriz modelo-vista o usar una sola matriz combinada modelo-vista-proyección (MVP), que le ahorra una multiplicación de matrices en su sombreador de vértices para siempre vértice único renderizado (después de todo tal multiplicación no viene gratis tampoco).

Así que para resumir mi pregunta: ¿Qué ventaja tiene una matriz combinada modelo-vista junto con una matriz de proyección separada sobre tener tres matrices separadas o una sola matriz MVP?

 45
Author: Mecki, 2012-05-16

2 answers

Míralo prácticamente. Primero, cuantas menos matrices envíe, menos matrices tendrá que multiplicar con posiciones / normales / etc. Y por lo tanto, más rápido sus sombreadores de vértices.

Así que el punto 1: menos matrices es mejor.

Sin embargo, hay ciertas cosas que probablemente necesita hacer. A menos que esté haciendo renderizado en 2D o algunas aplicaciones de demostración en 3D simples, necesitará hacer iluminación. Esto normalmente significa que vas a necesitar transformar posiciones y normales en ya sea el espacio del mundo o de la cámara (vista), luego realice algunas operaciones de iluminación en ellos (ya sea en el sombreador de vértices o en el sombreador de fragmentos).

No puedes hacer eso si solo vas del espacio del modelo al espacio de proyección. No se puede hacer iluminación en el espacio posterior a la proyección, porque ese espacio no es lineal. Las matemáticas se vuelven mucho más complicadas.

Así que, punto 2: Necesita al menos una parada entre el modelo y la proyección.

Así que necesitamos al menos 2 matrices. Por qué modelo a cámara que modelo-a-mundo? Porque trabajar en el espacio del mundo en shaders es una mala idea. Puede encontrar problemas de precisión numérica relacionados con traducciones que están distantes del origen. Mientras que, si trabajaras en el espacio de la cámara, no encontrarías esos problemas, porque nada está demasiado lejos de la cámara (y si lo está, probablemente debería estar fuera del plano de profundidad lejana).

Por lo tanto: utilizamos el espacio de la cámara como el espacio intermedio para la iluminación.

 35
Author: Nicol Bolas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-26 04:40:55

En la mayoría de los casos, su sombreador necesitará la geometría en coordenadas de mundo u ojo para sombrear, por lo que debe separar la matriz de proyección de las matrices de modelo y vista.

Hacer que el sombreador multiplique la geometría con dos matrices perjudica el rendimiento. Suponiendo que cada modelo tiene milésimos (o más) vértices, es más eficiente calcular una matriz de vista de modelo en la cpu una vez, y dejar que el sombreador haga una multiplicación mtrix-vector menos.

 2
Author: Tal Darom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-16 11:47:18