stringtranslate.com

Canalización de gráficos

El canal de gráficos por computadora , también conocido como canal de renderizado o canal de gráficos , es un marco dentro de los gráficos por computadora que describe los procedimientos necesarios para transformar una escena tridimensional (3D) en una representación bidimensional (2D) en una pantalla. [1] Una vez que se genera un modelo 3D, el proceso de gráficos convierte el modelo en un formato visualmente perceptible en la pantalla de la computadora. [2] Debido a la dependencia de software específico , configuraciones de hardware y atributos de visualización deseados, no existe un canal de gráficos de aplicación universal. Sin embargo, las interfaces de programación de aplicaciones gráficas (API), como Direct3D , OpenGL y Vulkan, se desarrollaron para estandarizar procedimientos comunes y supervisar la canalización de gráficos de un acelerador de hardware determinado. Estas API proporcionan una capa de abstracción sobre el hardware subyacente, lo que libera a los programadores de la necesidad de escribir código dirigido explícitamente a varios aceleradores de hardware de gráficos como AMD , Intel , Nvidia y otros.

El modelo de canalización de gráficos se utiliza generalmente en renderizado en tiempo real. A menudo, la mayoría de los pasos del proceso se implementan en hardware, lo que permite optimizaciones especiales . El término "pipeline" se utiliza en un sentido similar para el pipeline en los procesadores : los pasos individuales del pipeline se ejecutan en paralelo siempre que cada paso tenga lo que necesita.

Concepto

La canalización 3D generalmente se refiere a la forma más común de renderizado 3D por computadora llamado renderizado de polígonos 3D [ cita requerida ] , distinto de Raytracing y Raycasting . En Raycasting, un rayo se origina en el punto donde reside la cámara, y si ese rayo incide en una superficie, se calcula el color y la iluminación del punto de la superficie donde incide el rayo. En la renderización de polígonos 3D ocurre lo contrario: se calcula el área que está a la vista de la cámara y luego se crean rayos desde cada parte de cada superficie a la vista de la cámara y se rastrean hasta la cámara. [3]

Estructura

Un proceso de gráficos se puede dividir en tres partes principales: aplicación, geometría y rasterización. [4]

Solicitud

El paso de la aplicación lo ejecuta el software en el procesador principal ( CPU ). Durante el paso de aplicación, se realizan cambios en la escena según sea necesario, por ejemplo, mediante la interacción del usuario mediante dispositivos de entrada o durante una animación. La nueva escena con todas sus primitivas , normalmente triángulos, líneas y puntos, pasa al siguiente paso del proceso.

Ejemplos de tareas que normalmente se realizan en el paso de la aplicación son técnicas de detección de colisiones , animación, transformación y aceleración utilizando esquemas de subdivisión espacial como Quadtrees u Octrees . Estos también se utilizan para reducir la cantidad de memoria principal requerida en un momento dado. El "mundo" de un juego de computadora moderno es mucho más grande de lo que podría caber en la memoria a la vez.

Geometría

El paso de geometría (con Geometry pipeline ), que es responsable de la mayoría de las operaciones con polígonos y sus vértices (con Vertex pipeline ), se puede dividir en las siguientes cinco tareas. Depende de la implementación particular de cómo se organizan estas tareas como pasos reales del proceso paralelo.

Definiciones

Un vértice (plural: vértices) es un punto en el mundo. Se utilizan muchos puntos para unir las superficies. En casos especiales, las nubes de puntos se dibujan directamente, pero ésta sigue siendo la excepción.

Un triángulo es la primitiva geométrica más común de los gráficos por computadora. Está definido por sus tres vértices y un vector normal ; el vector normal sirve para indicar la cara frontal del triángulo y es un vector perpendicular a la superficie. El triángulo puede estar provisto de un color o de una textura (imagen "pegada" encima). Se prefieren los triángulos a los rectángulos porque sus tres puntos siempre existen en un solo plano .

El sistema de coordenadas mundial

El sistema de coordenadas mundial es el sistema de coordenadas en el que se crea el mundo virtual. Esto debe cumplir algunas condiciones para que las siguientes matemáticas sean fácilmente aplicables:

La forma de definir la unidad del sistema de coordenadas queda en manos del desarrollador. Por lo tanto, si el vector unitario del sistema corresponde en realidad a un metro o a un Ångström depende de la aplicación.

Ejemplo: si vamos a desarrollar un simulador de vuelo, podemos elegir el sistema de coordenadas mundial de modo que el origen esté en el centro de la Tierra y la unidad esté establecida en un metro. Además, para facilitar la referencia a la realidad, definimos que el eje X debe cortar al ecuador en el meridiano cero, y el eje Z pasa por los polos. En un sistema diestro, el eje Y pasa por el meridiano 90° Este (en algún lugar del Océano Índico ). Ahora tenemos un sistema de coordenadas que describe cada punto de la Tierra en coordenadas cartesianas tridimensionales . En este sistema de coordenadas, ahora estamos modelando los principios de nuestro mundo, montañas, valles y océanos.
Nota: Además de la geometría informática, para la Tierra se utilizan coordenadas geográficas , es decir, latitud y longitud , así como altitudes sobre el nivel del mar. La conversión aproximada, si no se tiene en cuenta el hecho de que la Tierra no es una esfera exacta, es sencilla:
con R = Radio de la Tierra [6.378.137m], lat = Latitud, long = Longitud, hasl = altura sobre el nivel del mar.
Todos los siguientes ejemplos se aplican en un sistema para diestros. Para un sistema para zurdos, es posible que sea necesario intercambiar las señales.

Los objetos contenidos dentro de la escena (casas, árboles, automóviles) a menudo se diseñan en su propio sistema de coordenadas de objeto (también llamado sistema de coordenadas del modelo o sistema de coordenadas local) por razones de modelado más simple. Para asignar estos objetos a coordenadas en el sistema de coordenadas mundial o sistema de coordenadas global de toda la escena, las coordenadas del objeto se transforman mediante traslación, rotación o escala. Esto se hace multiplicando las matrices de transformación correspondientes . Además, a partir de un objeto se pueden formar varias copias transformadas de forma diferente, por ejemplo un bosque a partir de un árbol; Esta técnica se llama creación de instancias.

Para ubicar un modelo de avión en el mundo, primero determinamos cuatro matrices. Como trabajamos en un espacio tridimensional, necesitamos matrices homogéneas de cuatro dimensiones para nuestros cálculos.

Primero, necesitamos tres matrices de rotación , es decir, una para cada uno de los tres ejes del avión (eje vertical, eje transversal, eje longitudinal).

Alrededor del eje X (generalmente definido como un eje longitudinal en el sistema de coordenadas del objeto)

Alrededor del eje Y (normalmente definido como el eje transversal en el sistema de coordenadas del objeto)

Alrededor del eje Z (generalmente definido como eje vertical en el sistema de coordenadas del objeto)

También utilizamos una matriz de traducción que mueve el avión al punto deseado en nuestro mundo: .

Observación : Las matrices anteriores están transpuestas con respecto a las de la matriz de rotación de artículos . Consulte más abajo para obtener una explicación del motivo.

Ahora podríamos calcular la posición de los vértices del avión en coordenadas mundiales multiplicando cada punto sucesivamente por estas cuatro matrices. Dado que la multiplicación de una matriz por un vector es bastante costosa (consume mucho tiempo), normalmente se toma otro camino y primero se multiplican las cuatro matrices juntas. La multiplicación de dos matrices es aún más costosa, pero debe ejecutarse sólo una vez para todo el objeto. Las multiplicaciones y son equivalentes. A partir de entonces, la matriz resultante podría aplicarse a los vértices. En la práctica, sin embargo, todavía no se aplica la multiplicación por los vértices, sino que primero se determinan las matrices de cámara (ver más abajo).

Sin embargo, en nuestro ejemplo anterior la traducción debe determinarse de otra manera, ya que el significado común de arriba , excepto en el Polo Norte, no coincide con nuestra definición del eje Z positivo y, por lo tanto, el modelo también debe rotarse. alrededor del centro de la Tierra: el primer paso empuja el origen del modelo a la altura correcta sobre la superficie de la Tierra, luego se gira según la latitud y la longitud.

El orden en que se aplican las matrices es importante, porque la multiplicación de matrices no es conmutativa . Esto también se aplica a las tres rotaciones, lo que se puede demostrar con un ejemplo: el punto (1, 0, 0) se encuentra en el eje X, si se gira primero 90° alrededor de la X y luego alrededor de la Y. eje, termina en el eje Z (la rotación alrededor del eje X no tiene ningún efecto sobre un punto que está en el eje). Si, por el contrario, se gira primero alrededor del eje Y y luego alrededor del eje X, el punto resultante se ubica en el eje Y. La secuencia en sí es arbitraria siempre que sea siempre la misma. La secuencia con x, luego y, luego z (alabeo, cabeceo, rumbo) suele ser la más intuitiva, porque la rotación hace que la dirección de la brújula coincida con la dirección de la "nariz".

También existen dos convenciones para definir estas matrices, dependiendo de si desea trabajar con vectores de columna o vectores de fila. Las diferentes bibliotecas de gráficos tienen diferentes preferencias aquí. OpenGL prefiere vectores de columna, vectores de fila de DirectX . La decisión determina de qué lado se multiplicarán los vectores puntuales por las matrices de transformación. Para los vectores de columna, la multiplicación se realiza desde la derecha, es decir , donde v out y v in son vectores de columna 4x1. La concatenación de las matrices también se realiza de derecha a izquierda, es decir, por ejemplo , al girar primero y luego al desplazarse.

En el caso de los vectores fila, esto funciona exactamente al revés. La multiplicación ahora se realiza desde la izquierda como con los vectores de 1x4 filas y la concatenación es cuando también rotamos primero y luego nos movemos. Las matrices mostradas arriba son válidas para el segundo caso, mientras que las de los vectores columna están transpuestas. Se aplica la regla [5] , que para la multiplicación con vectores significa que se puede cambiar el orden de multiplicación transponiendo la matriz.

En el encadenamiento de matrices, cada transformación define un nuevo sistema de coordenadas, lo que permite extensiones flexibles. Por ejemplo, la hélice de un avión, modelada por separado, se puede unir al morro del avión mediante traslación, que sólo cambia del modelo al sistema de coordenadas de la hélice. Para renderizar la aeronave, primero se calcula su matriz de transformación para transformar los puntos, seguido de multiplicar la matriz del modelo de hélice por la matriz de la aeronave para los puntos de la hélice. Esta matriz calculada se conoce como "matriz mundial", esencial para cada objeto en la escena antes de renderizar. Luego, la aplicación puede alterar dinámicamente estas matrices, como actualizar la posición de la aeronave con cada cuadro en función de la velocidad.

La matriz calculada de esta manera también se llama matriz mundial . Debe determinarse para cada objeto del mundo antes de renderizar. La aplicación puede introducir cambios aquí, por ejemplo cambiar la posición del avión según la velocidad después de cada cuadro.

Transformación de cámara

Izquierda: Posición y dirección del visor virtual (cámara), según lo definido por el usuario. Derecha: Posicionamiento de los objetos después de la transformación de la cámara. El área gris claro es el volumen visible.

Además de los objetos, la escena también define una cámara o visor virtual que indica la posición y dirección de visión con respecto a la cual se representa la escena. La escena se transforma para que la cámara esté en el origen mirando a lo largo del eje Z. El sistema de coordenadas resultante se llama sistema de coordenadas de cámara y la transformación se llama transformación de cámara o transformación de vista .

La matriz de visión generalmente se determina a partir de la posición de la cámara, el punto objetivo (hacia donde mira la cámara) y un "vector ascendente" ("arriba" desde el punto de vista del espectador). Se requieren los primeros tres vectores auxiliares:
Zaxis = normal(cameraPosition - cameraTarget)
Xaxis = normal(cross(cameraUpVector, Zaxis))
Yaxis = cross(Zaxis, Xaxis )
Con normal(v) = normalización del vector v;
cross(v1, v2) = producto cruzado de v1 y v2.
Finalmente, la matriz:
con punto (v1, v2) = producto escalar de v1 y v2.

Proyección

El paso de proyección 3D transforma el volumen de la vista en un cubo con las coordenadas de los puntos de las esquinas (-1, -1, 0) y (1, 1, 1); Ocasionalmente también se utilizan otros volúmenes de destino. Este paso se llama proyección , aunque transforma un volumen en otro volumen, ya que las coordenadas Z resultantes no se almacenan en la imagen, sino que solo se utilizan en el almacenamiento en búfer Z en el paso posterior de rasterización. En una ilustración en perspectiva , se utiliza una proyección central . Para limitar la cantidad de objetos mostrados, se utilizan dos planos de recorte adicionales; El volumen visual es, por tanto, una pirámide truncada ( truncada ). La proyección paralela u ortogonal se utiliza, por ejemplo, para representaciones técnicas porque tiene la ventaja de que todos los paralelos en el espacio de objetos también lo son en el espacio de imágenes, y las superficies y volúmenes tienen el mismo tamaño independientemente de la distancia del espectador. . Los mapas utilizan, por ejemplo, una proyección ortogonal (la llamada ortofoto ), pero las imágenes oblicuas de un paisaje no se pueden utilizar de esta manera; aunque técnicamente se pueden representar, parecen tan distorsionadas que no podemos utilizarlas. La fórmula para calcular una matriz de mapeo en perspectiva es:

Con h = cot (fieldOfView / 2.0) (ángulo de apertura de la cámara); w = h / relación de aspecto (relación de aspecto de la imagen de destino); cerca = Distancia más pequeña para ser visible; lejos = La distancia más larga para ser visible.

Las razones por las que aquí se deben indicar la distancia más pequeña y más grande son, por un lado, que esta distancia se divide para alcanzar la escala de la escena (los objetos más distantes son más pequeños en una imagen en perspectiva que los objetos cercanos). y, por otro lado, escalar los valores Z al rango 0..1, para llenar el búfer Z. Este buffer a menudo tiene sólo una resolución de 16 bits, por lo que los valores cercanos y lejanos deben elegirse con cuidado. Una diferencia demasiado grande entre el valor cercano y lejano conduce a la llamada lucha Z debido a la baja resolución del búfer Z. También se puede ver en la fórmula que el valor cercano no puede ser 0, porque este punto es el punto focal de la proyección. No hay ninguna imagen en este momento.

En aras de la exhaustividad, la fórmula para la proyección paralela (proyección ortogonal):

con w = ancho del cubo objetivo (dimensión en unidades del sistema de coordenadas mundial); H = w / relación de aspecto (relación de aspecto de la imagen de destino); cerca = Distancia más pequeña para ser visible; lejos = La distancia más larga para ser visible.

Por razones de eficiencia, la cámara y la matriz de proyección se combinan normalmente en una matriz de transformación, de modo que se omite el sistema de coordenadas de la cámara. La matriz resultante suele ser la misma para una sola imagen, mientras que la matriz mundial parece diferente para cada objeto. Por eso, en la práctica, la vista y la proyección se calculan previamente, de modo que durante la visualización sólo es necesario adaptar la matriz mundial. Sin embargo, son posibles transformaciones más complejas, como la combinación de vértices. También se pueden ejecutar sombreadores de geometría libremente programables que modifican la geometría.

En el paso de renderizado real, la matriz mundial * la matriz de la cámara * la matriz de proyección se calcula y finalmente se aplica a cada punto. De este modo, los puntos de todos los objetos se transfieren directamente al sistema de coordenadas de la pantalla (al menos casi, el rango de valores de los ejes sigue siendo -1..1 para el rango visible, consulte la sección "Transformación de ventana-vista").

Encendiendo

A menudo, una escena contiene fuentes de luz colocadas en diferentes posiciones para que la iluminación de los objetos parezca más realista. En este caso, se calcula un factor de ganancia para la textura para cada vértice en función de las fuentes de luz y las propiedades del material asociadas con el triángulo correspondiente. En el último paso de rasterización, los valores de los vértices de un triángulo se interpolan sobre su superficie. Se aplica una iluminación general (luz ambiental) a todas las superficies. Se trata de la luminosidad difusa y, por tanto, independiente de la dirección de la escena. El sol es una fuente de luz dirigida, que se puede suponer que está infinitamente lejos. La iluminación efectuada por el sol sobre una superficie se determina formando el producto escalar del vector direccional del sol y el vector normal de la superficie. Si el valor es negativo, la superficie está orientada hacia el sol.

Recorte

Recorte de primitivas contra el cubo. El triángulo azul se descarta mientras que el triángulo naranja se recorta, creando dos nuevos vértices.
Tronco

Sólo es necesario rasterizar ( dibujar) las primitivas que están dentro del volumen visual. Este volumen visual se define como el interior de un tronco , una forma en forma de pirámide con la parte superior cortada. Se descartan los primitivos que quedan completamente fuera del volumen visual; Esto se llama selección frustum . En teoría, se pueden ejecutar otros métodos de selección, como la selección de la cara posterior, que reduce la cantidad de primitivas a considerar, en cualquier paso del proceso de gráficos. Las primitivas que estén sólo parcialmente dentro del cubo deben recortarse contra el cubo. La ventaja del paso de proyección anterior es que el recorte siempre se realiza contra el mismo cubo. Sólo las primitivas (posiblemente recortadas) que se encuentran dentro del volumen visual se reenvían al paso final.

Transformación ventana-vista

Transformación de ventana gráfica

Para enviar la imagen a cualquier área de destino (ventana gráfica) de la pantalla, se debe aplicar otra transformación, la transformación Ventana-Ventana . Este es un cambio, seguido de una ampliación. Las coordenadas resultantes son las coordenadas del dispositivo de salida. La ventana gráfica contiene 6 valores: altura y ancho de la ventana en píxeles, la esquina superior izquierda de la ventana en coordenadas de ventana (generalmente 0, 0) y los valores mínimo y máximo de Z (generalmente 0 y 1).

Formalmente:
Con vp=Vista; v=Punto después de la proyección

En el hardware moderno, la mayoría de los pasos de cálculo de la geometría se realizan en el sombreador de vértices . En principio es libremente programable, pero generalmente realiza al menos la transformación de los puntos y el cálculo de la iluminación. Para la interfaz de programación DirectX, es necesario el uso de un sombreador de vértices personalizado a partir de la versión 10, mientras que las versiones anteriores todavía tienen un sombreador estándar.

Rasterización

El paso de rasterización es el último paso antes del proceso de sombreado de fragmentos con el que se rasterizan todas las primitivas . En el paso de rasterización, se crean fragmentos discretos a partir de primitivas continuas.

En esta etapa del proceso de gráficos, los puntos de la cuadrícula también se denominan fragmentos, en aras de una mayor distinción. Cada fragmento corresponde a un píxel en el frame buffer y éste corresponde a un píxel de la pantalla. Estos pueden ser coloreados (y posiblemente iluminados). Además, en el caso de polígonos superpuestos, es necesario determinar el fragmento visible más cercano al observador. Para la denominada determinación de superficies ocultas se suele utilizar un tampón Z. El color de un fragmento depende de la iluminación, la textura y otras propiedades del material de la primitiva visible y, a menudo, se interpola utilizando las propiedades del vértice del triángulo. Cuando esté disponible, se ejecuta un sombreador de fragmentos (también llamado Pixel Shader ) en el paso de rasterizado para cada fragmento del objeto. Si un fragmento es visible, ahora se puede mezclar con valores de color ya existentes en la imagen si se utiliza transparencia o muestreo múltiple. En este paso, uno o más fragmentos se convierten en un píxel.

Para evitar que el usuario vea la rasterización gradual de las primitivas, se realiza un doble almacenamiento en búfer. La rasterización se realiza en un área de memoria especial. Una vez que la imagen ha sido completamente rasterizada, se copia al área visible de la memoria de imágenes.

Inverso

Todas las matrices utilizadas son no singulares y, por tanto, invertibles. Dado que la multiplicación de dos matrices no singulares crea otra matriz no singular, toda la matriz de transformación también es invertible. Se requiere lo contrario para recalcular las coordenadas mundiales a partir de las coordenadas de la pantalla; por ejemplo, para determinar a partir de la posición del puntero del mouse el objeto en el que se hizo clic. Sin embargo, como la pantalla y el ratón sólo tienen dos dimensiones, se desconoce la tercera. Por lo tanto, se proyecta un rayo en la posición del cursor hacia el mundo y luego se determina la intersección de este rayo con los polígonos del mundo.

sombreador

Hay 11 fases, cada una de las cuales se enumera aquí. El sombreador de vértices y el código 3D son la entrada para la animación y la transformación. La segunda fase es el sombreador de casco, la teselación y el sombreador de dominio. La tercera fase es el sombreador de geometría. La cuarta fase es la transformación de la perspectiva. La quinta fase es el recorte y la eliminación de la cara posterior. La sexta fase es la rasterización de triángulos, que genera coordenadas de textura. La séptima fase, caché de texturas, comienza por separado y toma texturas como entrada. La séptima fase y las coordenadas de textura pasan a la octava fase, filtrado de texturas. De la sexta fase y la salida de la octava fase, texels, se pasa a la novena fase, Z inicial y sombreado de píxeles, que también toma un sombreador de píxeles como entrada. La décima fase es la prueba Z, la combinación alfa y el suavizado. Luego, la undécima fase es el posprocesamiento, que genera un búfer consecutivo.

Las tarjetas gráficas clásicas todavía están relativamente cerca del proceso de gráficos. Con las crecientes demandas sobre la GPU , las restricciones se eliminaron gradualmente para crear más flexibilidad. Las tarjetas gráficas modernas utilizan una canalización controlada por sombreadores y de libre programación, que permite el acceso directo a los pasos de procesamiento individuales. Para aliviar el procesador principal, se han trasladado pasos de procesamiento adicionales a la canalización y a la GPU.

Las unidades de sombreado más importantes son los sombreadores de vértices , los sombreadores de geometría y los sombreadores de píxeles.

Se ha introducido el Unified Shader para aprovechar al máximo todas las unidades. Esto proporciona un único grupo grande de unidades de sombreado. Según sea necesario, el grupo se divide en diferentes grupos de sombreadores. Por lo tanto, ya no resulta útil una separación estricta entre los tipos de sombreadores.

También es posible utilizar el llamado sombreador de cálculo para realizar cualquier cálculo a partir de la visualización de un gráfico en la GPU. La ventaja es que funcionan de forma muy paralela, pero existen limitaciones. Estos cálculos universales también se denominan computación de propósito general en unidades de procesamiento gráfico , o GPGPU para abreviar.

Los sombreadores de malla son una incorporación reciente y tienen como objetivo superar los cuellos de botella del diseño fijo de la tubería de geometría. [6]

Ver también

Fuentes

Referencias

  1. ^ "Canalización de gráficos". Microsoft . 30 de mayo de 2018 . Consultado el 15 de junio de 2015 .
  2. ^ "Conferencia: Canalización de gráficos y animación". Archivado desde el original el 7 de diciembre de 2017 . Consultado el 15 de junio de 2015 .
  3. ^ Lawrence, Jason (22 de octubre de 2012). "Canalidad de renderizado de polígonos 3D" (PDF) . Archivado (PDF) desde el original el 29 de diciembre de 2016 . Consultado el 19 de septiembre de 2019 .
  4. ^ Akenine-Möller, Haines y Hoffman 2019, pág. 13 2.1 Arquitectura Figura 2.2
  5. ^ Nipp, K.; Stoffer, D. (1998). Álgebra lineal . v/d/f Hochschulverlag der ETH Zürich. ISBN 3-7281-2649-7.
  6. ^ Rendimiento API avanzado: sombreadores de malla

enlaces externos