¿Qué significa el proceso de renderizado de gráficos en Unity y cómo aplicarlo?
El llamado proceso de renderizado de GPU suena muy avanzado. De hecho, podemos entenderlo como un proceso, es decir, le decimos a la GPU una gran cantidad de datos y finalmente obtenemos una imagen bidimensional. y estos Los datos incluyen elementos como "punto de vista, objeto tridimensional, fuente de luz, modelo de iluminación, textura".
En varios libros de gráficos, el proceso de renderizado se divide principalmente en tres etapas: etapa de aplicación, etapa de geometría y etapa de ráster.
1. Etapa de solicitud.
Esta etapa es relativamente fácil de entender. Por ejemplo, si desarrollamos un juego en Unity, Unity en realidad ha implementado muchas cosas subyacentes para nosotros, como detección de colisiones, recorte de frustum, etc. Se ocupa de la CPU y la memoria. Una vez completados todos los cálculos, al final de esta etapa, estos datos calculados (coordenadas de vértice, vectores normales, coordenadas de textura y texturas) se transmitirán al hardware de gráficos a través del bus de datos. los datos de origen para nuestro procesamiento posterior.
2. Escenario geométrico.
Principalmente responsable de la transformación de coordenadas de vértice, iluminación, recorte, proyección y mapeo de pantalla. La etapa de transformación se basa en los cálculos de GPU. Al final de esta etapa, las coordenadas de vértice, el color y la textura después de la transformación. y se obtienen proyecciones. En resumen, el trabajo principal de la etapa de geometría es la "transformación de coordenadas de vértices tridimensionales" y el "cálculo de iluminación".
Surge la pregunta, ¿por qué necesitamos transformar las coordenadas de los vértices? Así es como lo entiendo, por ejemplo, si tienes una escena de juego tridimensional, cada modelo en la escena puede usar un vector para determinar su posición, pero ¿cómo dejas que la computadora dibuje el modelo correcta y jerárquicamente en la pantalla? ¿Basado en estas coordenadas? Es por eso que necesitamos transformar las coordenadas de los vértices tridimensionales. El objetivo final es permitir que la GPU dibuje estos datos tridimensionales en una pantalla bidimensional.
Según el orden de transformación de coordenadas de vértice, existen principalmente los siguientes espacios de coordenadas: espacio de objetos, espacio de coordenadas de modelo; espacio de coordenadas mundial, espacio de coordenadas de observación; espacio de coordenadas de la pantalla. La siguiente figura muestra todo el flujo de procesamiento de la GPU. El área oscura es el proceso de transformación del espacio de coordenadas del vértice. Lo que debemos prestar atención es el significado específico de cada espacio de coordenadas y el método de conversión. entre espacios de coordenadas.
2.1, del espacio de objetos al espacio mundial
El espacio de objetos tiene dos significados principales. Primero, los valores de coordenadas en el espacio de objetos son los valores de vértice en el archivo de modelo. Estos valores se obtienen al construir un modelo, como un archivo .max, los datos contenidos en él son las coordenadas del espacio del objeto. En segundo lugar, las coordenadas del espacio de objetos no tienen relación de referencia con otros objetos. Ésta es la clave para distinguir el espacio de objetos del espacio mundial. El significado real de las coordenadas del espacio mundial es que existe un origen de coordenadas. Sólo comparando el objeto con el origen de las coordenadas se puede conocer su posición exacta. Por ejemplo, en Unity, después de importar un modelo a la escena, su transformación es la coordenada mundial.
2.2, del espacio mundial al espacio ocular
El llamado espacio ocular es un cuerpo trapezoidal con la cámara como origen y compuesto por la dirección de la línea de visión y el ángulo de visión. y los planos lejano y cercano, como se muestra a continuación, se denomina tronco de visualización. El plano cercano es la superficie rectangular más pequeña del trapezoide, que también es el plano cercano a la cámara. El plano lejano es el rectángulo más grande del trapezoide, que se utiliza como plano de proyección. Los datos dentro de este volumen trapezoidal son visibles y el punto de vista eliminará la parte sobrante, también llamado recorte truncado.
Por ejemplo, en la función de itinerancia del juego, el contenido de la pantalla cambia a medida que la cámara se mueve. Esto se debe a que la GPU convierte las coordenadas de vértice del objeto del espacio mundial al espacio ocular.
2.3, del espacio ocular al espacio proyectado y recortado
El proceso de convertir las coordenadas del espacio ocular en coordenadas espaciales proyectadas y recortadas es en realidad un proceso de proyección, recorte y mapeo. Debido a que es muy difícil recortar dentro de un tronco de visualización irregular, las personas anteriores organizaron el recorte en un cubo unitario. Este cubo se llama cubo canónico (CCV). El plano cercano del CVV (correspondiente al tronco de visualización) es x y. Las coordenadas y del plano cercano) corresponden a las coordenadas de los píxeles de la pantalla (esquina inferior izquierda 0, 0), y z representa la profundidad de los píxeles de la pantalla. Entonces, este proceso de conversión en realidad consta de tres pasos:
(1), usar la matriz de transformación de perspectiva para transformar los vértices de la vista frustum en
(2), en CVV; Recorte dentro;
(3), mapeo de pantalla: asigne las coordenadas obtenidas a través de los dos primeros pasos al sistema de coordenadas de la pantalla.
2.4, ensamblaje primitivo (ensamblaje primitivo) y configuración de triángulos (procesamiento de triángulos)
Hasta ahora hemos obtenido un montón de datos de vértices. Este paso se basa en los datos primitivos de estos. vértices. La relación de conexión restaura la estructura de la cuadrícula. La malla se compone de vértices e índices. Esta etapa consiste en unir los vértices de acuerdo con los índices para formar unidades de línea y superficie, y luego recortarlas si un triángulo excede la pantalla, por ejemplo, dos vértices están dentro de la pantalla. Un vértice está fuera de la pantalla. Lo que vemos en la pantalla en este momento es un cuadrilátero, y luego cortamos este cuadrilátero en dos triángulos pequeños.
Ahora tenemos un montón de parches triangulares en las coordenadas de la pantalla, que se utilizan para la rasterización.
3. Etapa de rasterización.
Después de los pasos anteriores, obtenemos el valor de las coordenadas de pantalla de cada punto y la primitiva que necesitamos dibujar, pero todavía hay dos problemas en este momento:
(1) Pantalla Las coordenadas son números de punto flotante, pero los píxeles están representados por números enteros. ¿Cómo determinar el píxel correspondiente al valor de las coordenadas de la pantalla?
(2) ¿Cómo dibujar un segmento de línea o un triángulo en la pantalla en función del punto determinado?
Para la pregunta 1, la posición dibujada solo puede estar cerca de la posición real del segmento de línea entre los dos puntos finales especificados. Por ejemplo, la posición de un segmento de línea es (10.48, 20.51) y el píxel convertido. la posición es (10, 21).
La pregunta 2 implica algoritmos específicos de dibujo y llenado de líneas. Si está interesado, puede estudiarlo.
Una vez completado este proceso, los vértices y las primitivas se han asignado a píxeles. El siguiente proceso es cómo procesar los píxeles, es decir, asignar valores de color a los píxeles.
La etapa de asignación de color a los píxeles se llama Operación de píxeles, que es una serie final de operaciones para cada fragmento antes de actualizar el búfer de cuadros. El propósito es calcular el valor de color de cada píxel. En esta etapa, las caras ocluidas se eliminan mediante un proceso llamado prueba de profundidad.
La operación de píxeles incluye los siguientes procesos:
(1) Eliminar superficies de oclusión
(2) Operación de textura, operación de textura, basada en las coordenadas de textura de; el píxel, consulta el valor de textura correspondiente;
(3) La fusión, generalmente llamada fusión alfa, se basa en el color que se ha pintado hasta ahora y se mezcla con el valor alfa del color que se está calculando. para formar un nuevo color.
(4) Filtrado, genera el color que se calcula después de pasar un filtro determinado.
Después de esta etapa, el valor de color del píxel se escribe en el frame buffer.