tutoriales tutorial transformaciones matrices geometricas for beginners opengl glsl

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



opengl tutoriales (2)

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

  1. La Matriz Modelo . Esta matriz es individual para cada modelo y gira y escala el objeto según lo deseado y finalmente lo mueve a su posición final dentro de su mundo 3D. "La matriz modelo transforma las coordenadas del modelo en coordenadas mundiales".

  2. La Matriz de Vista . Esta matriz suele ser la misma para una gran cantidad de objetos (si no para todos) y gira y mueve todos los objetos de acuerdo con la "posición de la cámara" actual. Si imagina que la escena 3D es filmada por una cámara y lo que se muestra en la pantalla son las imágenes que capturó esta cámara, la ubicación de la cámara y su dirección de visión definen qué partes de la escena son visibles y cómo los objetos aparecer en la imagen capturada Hay pocas razones para cambiar la matriz de vista mientras se renderiza un solo cuadro, pero de hecho existen (p. Ej. Representando 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 cuadros que se están dibujando. "The View Matrix transforma las coordenadas del mundo en coordenadas del ojo".

  3. La matriz de proyección . La matriz de proyección decide cómo esas coordenadas 3D se asignan a coordenadas 2D, por ejemplo, si hay una perspectiva aplicada a ellas (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. Puede tener que cambiar si está renderizando en una ventana y el tamaño de la ventana ha cambiado o si está renderizando a pantalla completa y la resolución ha cambiado, sin embargo, solo si el tamaño de la nueva ventana / resolución de pantalla tiene una relación de aspecto de pantalla diferente a la anterior. Hay algunos efectos extravagantes para los que puede querer cambiar esta matriz, pero en la mayoría de los casos es bastante constante durante toda la vida de su programa. "La matriz de proyección transforma las coordenadas del ojo en coordenadas de la pantalla".

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

Ahora, si observa 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 de vista de modelo. ¿Por qué? Este diseño lo obliga a guardar y restaurar permanentemente la "matriz de vistas", ya que se "destruirá" por las transformaciones del modelo que se le apliquen. ¿Por qué no hay tres matrices separadas?

Si observa las nuevas versiones de OpenGL (OpenGL 3.x / 4.x) y no utiliza la tubería de renderización clásica, sino que personaliza todo con sombreadores (GLSL), ya no hay matrices disponibles, tiene que define tus propias matrices. Todavía 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 utilizar ninguna de las tres matrices, lo que significa que no tiene que guardar y restaurar permanentemente la matriz de vista de modelo o usa una sola matriz combinada de vista de modelo (MVP), que le ahorra una multiplicación de matriz en su sombreador de vértices para siempre un solo vértice renderizado (después de todo, tal multiplicación tampoco se obtiene gratis).

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


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

Hacer que tu sombreador multiplique la geometría con dos matrices perjudica el rendimiento. Suponiendo que cada modelo tenga miles (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 menos de mtrix-vector.


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

Entonces punto 1: menos matrices es mejor.

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

No puede hacer eso si solo va del espacio modelo al espacio de proyección. No puede hacer iluminación en el espacio posterior a la proyección, porque ese espacio no es lineal. La matemática se vuelve mucho más complicada.

Entonces, punto 2: necesitas al menos una parada entre el modelo y la proyección.

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

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