La Red de Conocimientos Pedagógicos - Currículum vitae - Traducción del Manual-3 de OpenGL ES. Rasterización(1)

Traducción del Manual-3 de OpenGL ES. Rasterización(1)

La rasterización es el proceso de convertir primitivas en imágenes bidimensionales. Cada punto de la imagen contiene información como color y profundidad. Por tanto, las primitivas rasterizadas contienen dos partes. El primer paso es determinar el cuadrado de la cuadrícula de números enteros ocupado por la primitiva en coordenadas de ventana. En segundo lugar, asigne valores de color y profundidad a cada cuadrado. Los resultados del procesamiento se pasan a la siguiente etapa de GL (operación para cada segmento), y GL usa esta información para actualizar la ubicación apropiada correspondiente en el búfer de cuadros. La Figura 3.1 es el proceso de rasterización. El color de un fragmento está determinado por un sombreador de fragmentos (consulte la Sección 3.8), que se implementa mediante el uso de variables mutables generadas por operaciones de rasterización (consulte las Secciones 3.3 a 3.6). El valor de profundidad final lo determina la operación de rasterización, y el sombreador de fragmentos especifica el resultado del punto, línea o polígono rasterizado.

Una cuadrícula, los parámetros de dirección Z (profundidad) y los datos cambiantes se denominan colectivamente fragmentos; estos parámetros se denominan colectivamente datos asociados. Un fragmento se basa en un sistema de coordenadas de cuadrícula de números enteros. Una operación de rasterización que comienza desde la esquina inferior izquierda también tiene un centro de fragmento especificado, que está desplazado (1/2, 1/2) desde la esquina inferior izquierda (es decir, según). coordenadas semienteros).

En GL, no es necesario que la cuadrícula sea completamente cuadrada. Las reglas de rasterización no se ven afectadas por la relación de aspecto real de la cuadrícula. Mostrar una cuadrícula no cuadrada hará que los puntos rasterizados y los segmentos de línea parezcan más gruesos en una dirección que en otra. Especificamos que los fragmentos son cuadrados, lo que simplifica las operaciones de suavizado y texturizado.

Varios factores afectan la rasterización. Los puntos pueden tener diferentes diámetros y los segmentos de línea pueden tener diferentes anchos. Se debe utilizar el muestreo múltiple para rasterizar primitivas suavizadas (consulte la Sección 3.2).

Considere una traducción de la primitiva (x, y) en el sistema de coordenadas de la ventana, donde xey son números enteros. Siempre que la suma no se recorte, cada segmento generado a partir de cada segmento y correspondiente a cada segmento es el mismo, pero el centro de la suma está desplazado.

El multimuestreo es un mecanismo anti-aliasing para primitivas GL (puntos, líneas y triángulos). Esta técnica muestrea cada píxel de todas las primitivas varias veces. Después de cada actualización de píxeles, el valor de la muestra de color se resolverá en un único color que se puede mostrar y las operaciones de suavizado se manejarán automáticamente en el nivel de la aplicación. Debido a que cada punto de muestra contiene información de color, profundidad y plantilla, las funciones de color (incluidas las operaciones de textura), profundidad y plantilla son las mismas que en el modo de muestra única.

También hay un búfer llamado búfer de muestreo múltiple, que se agrega al búfer de cuadros. Los valores de muestra del píxel, incluidos los valores de color, profundidad y plantilla, se almacenan en este búfer. Cuando el framebuffer contiene un búfer multimuestra, el framebuffer no tiene búferes de profundidad y plantilla, e incluso el búfer multimuestra no almacena los valores de profundidad y plantilla. Sin embargo, los búferes de color y los búferes de muestreo múltiple se almacenan en formato *.

El suavizado de muestreo múltiple es muy útil para renderizar triángulos porque no requiere clasificación para eliminar superficies ocultas y puede manejar correctamente triángulos adyacentes, contornos de objetos e incluso triángulos que se cruzan.

Si el valor de SAMPLE_BUFFERS es 1, la rasterización de todas las primitivas cambia, pero se refiere a la rasterización de múltiples muestras. La rasterización de primitivas se refiere a la rasterización de una sola muestra. El valor de SAMPLE_BUFFERS se puede consultar estableciendo el pname de la función GetIntegerv en SAMPLE_BUFFERS.

En múltiples pases de renderizado, el contenido de un fragmento de píxel se puede renderizar de dos maneras. Primero, cada fragmento contiene un valor de información de un número de muestra. Este valor de muestra es una constante dependiente de la implementación que se puede consultar estableciendo el pname de la función GetIntegerv en SAMPLES.

En segundo lugar, cada fragmento contiene el valor de profundidad de una muestra y algunos valores variables, en lugar de un único valor de profundidad y algunas variables variables en el modo de renderizado de muestra única. Las implementaciones de GL pueden optar por asignar la misma variable mutable a múltiples valores de muestra. La ubicación donde se calcula el valor del cambio puede ser cualquier lugar dentro del píxel, incluido el centro del fragmento o la ubicación de muestreo. No es necesario evaluar los valores cambiantes en la misma ubicación.

Por lo tanto, cada fragmento de píxel consta de los números enteros xey de las coordenadas de la cuadrícula, el valor de variación de la muestra y la información de bits de la muestra más grande.

Después de crear un contexto GL, la rasterización multimuestreo no se puede activar ni desactivar. Si SAMPLE_BUFFER es 1, entonces está activado, no 1, entonces está desactivado.

La rasterización de primitivas de múltiples muestras difiere significativamente de la rasterización de una sola muestra. Se puede entender que cada píxel en el búfer de cuadros tiene una posición de muestra correspondiente. Estas ubicaciones no son una región o área, sino una ubicación precisa, y cada ubicación se denomina punto de muestreo. La ubicación del punto de muestreo asociado con un píxel puede estar dentro o fuera de la celda cuadrada, que es el límite del píxel. Además, la posición relativa de los puntos de muestra puede ser la misma o diferente para cada píxel en el búfer de cuadros.

Si la posición del punto de muestreo es diferente del píxel, entonces la posición del punto de muestreo debe estar alineada con la ventana en lugar de con la pantalla. Además, los resultados del renderizado también están especificados por la posición de la ventana. Los requisitos de invariancia descritos en la Sección 3.1 se relajan para todas las rasterizaciones multimuestreadas, ya que la posición de muestreo puede ser una función de la posición del píxel.

No se puede consultar la posición de muestreo real del píxel.

El tamaño del punto se obtiene de la variable integrada gl_PointSize del sombreador y está limitado por un rango de tamaño de punto que depende de la implementación. Si gl_PointSize es menor o igual a 0, se producen resultados indefinidos. El rango de tamaño de puntos está determinado por el rango de tamaño de puntos de alias, como se describe en el Capítulo 6. El número máximo de puntos admitidos es al menos 1.

La rasterización de puntos produce un fragmento por cada píxel del framebuffer, con el píxel centrado en el punto central.

En un cuadrado, los lados del cuadrado son iguales que los puntos.

A todos los fragmentos resultantes de un punto rasterizado se les asignan los mismos datos asociados, es decir, los datos correspondientes a los vértices de ese punto. Al mismo tiempo, la entrada del sombreador de fragmentos gl_PointCoord define el espacio del sistema de coordenadas (S, T) de cada unidad de fragmento, donde la variable S es el punto horizontal de izquierda a derecha de 0 a 1, y T es el punto vertical de de arriba a abajo 0 a 1. .

La siguiente fórmula se utiliza para calcular el valor de (s, t):

Tamaño es el tamaño de un punto, es el valor entero de las coordenadas de la ventana del fragmento, y también es el vértice exacto del punto. Coordenadas de ventana ilimitadas.

Si SAMPLE_BUFFERS es 1, el punto se rasterizará de la siguiente manera. La rasterización de un punto produce para cada píxel del framebuffer un fragmento con uno o más puntos de muestra que se encuentran en una región centrada en el punto. Esta área es un cuadrado con lados iguales al tamaño de un píxel. Los bits de cobertura de los puntos de muestreo correspondientes que se cruzan con esta área son todos 1 y los demás bits de cobertura son todos 0. Los datos asociados a cada muestra del fragmento son los datos asociados a la rasterización de los puntos. El rango admitido de tamaños de puntos es el mismo que el de los puntos sin muestreo múltiple.

Un segmento de línea es una línea, un bucle de línea o una serie de segmentos de línea individuales. El ancho de la línea se puede determinar llamando a una función.

Establezca un número positivo apropiado para controlar el ancho de los segmentos de línea rasterizados. El ancho predeterminado es 1,0. Valores menores o iguales a 0.0 generarán un error INVALID_VALUE.

La rasterización de líneas primero describe el segmento de línea como el eje x o el eje y. El segmento de línea x grande tiene una pendiente [-1, 1] en el intervalo cerrado; todos los demás segmentos de línea son segmentos de línea largos del eje y (la pendiente está determinada por los puntos finales del segmento de línea). Solo especificaremos la rasterización para la parte del eje x a menos que el cambio en la parte del eje y no sea perceptible.

Lo ideal es que GL utilice la regla de "salida de diamante" para identificar aquellos segmentos generados por segmentos de línea rasterizados. Para cada segmento f centrado en las coordenadas de la ventana y , defina una región en forma de rombo donde se cruzan cuatro semiplanos:

Esencialmente, los extremos de los segmentos punto a punto producen algún segmento F que se cruza a menos que se incluya , como se muestra en la Figura 3.2.

Para evitar dificultades con los puntos finales en los límites, en principio perturbaremos ligeramente los puntos finales. Las respectivas coordenadas de ventana de punto y punto son y. Las coordenadas de la suma de los puntos finales de la perturbación son suma.

Estos segmentos F se generan a partir de los segmentos de línea desde hasta , que se generan después de que los segmentos de línea desde hasta se cruzan con los segmentos de línea, a menos que el punto esté en el medio ε sea una pequeña cantidad elegida al rasterizar los segmentos de línea para hacer los segmentos. producir los mismos segmentos δ significa que hay 0

Cuando y están en el centro del segmento, la caracterización del segmento se puede simplificar a una modificación usando el algoritmo de Bresenham: el segmento de línea resultante en este caso. Se llama "medio abierto", lo que significa que el último fragmento (correspondiente a) no se dibuja. Esto significa que al rasterizar una serie de segmentos de línea interconectados con puntos finales, solo funcionará una vez en lugar de dos (al igual que el algoritmo de Bresenham).

Debido a que las condiciones iniciales y finales de la regla de salida del diamante pueden ser difíciles de implementar, se permite que otros algoritmos de rasterización de segmentos sigan las siguientes reglas:

A continuación, debemos interpretar la relación entre cada segmento rasterizado Cómo se obtuvieron los datos relevantes. El valor de las coordenadas de la ventana del centro del fragmento generado es la suma, luego hay

(tenga en cuenta que t = 0 en el punto y t = 1 en el punto). El valor de los datos f relacionados con el fragmento, ya sea la coordenada W de recorte o el elemento generado por la variable variable del sombreador de vértices, se puede expresar como

Son los datos relacionados con los puntos inicial y final. del segmento de recta. son el punto inicial y el punto final del segmento de línea en el sistema de coordenadas de recorte w. La ventana z es un valor de profundidad y se debe utilizar la interpolación lineal:

Solo describimos la rasterización de segmentos de línea sin suavizado. Ahora introduzcamos algunos parámetros comunes al rasterizar segmentos de línea.

El ancho real de una línea sin suavizado se determina redondeando el ancho deseado a un valor entero y luego eliminando este número para obtener el ancho máximo de una línea sin suavizado. Si el ancho especificado se redondea a 0, el valor se trata como 1.

A excepción de los segmentos de línea con un ancho de 1, que no tienen suavizado, todos se rasterizan desplazándolos en la dirección secundaria (Y representa la línea principal X, X representa la línea principal Y ) o copiando los fragmentos en la dirección secundaria (como se muestra en la figura) 3.3). W representa el ancho del número entero (si w = 0, W se establece en 1). Si el segmento de línea está en el sistema de coordenadas de la ventana y el punto final del segmento de línea rasterizado es suma, esto no producirá un solo fragmento, pero producirá una altura W (para el eje Y) en cada segmento de línea de posición X. W es la longitud de un segmento de línea) columna. El fragmento posicionado más bajo en la columna es el fragmento resultante de rasterizar un segmento de línea de ancho 1 en el sistema de coordenadas modificado.

El estado GL requiere que la rasterización de líneas consista en puntos flotantes con anchos de línea. El valor inicial del ancho de línea es 1,0.

Si el valor de SAMPLE_BUFFERS es 1, la rasterización de líneas utilizará el siguiente algoritmo. Para cada píxel del framebuffer con uno o más puntos de muestra que intersecan un rectángulo centrado en un segmento de línea, la rasterización de líneas genera un fragmento para cada píxel (como se muestra en la Figura 3.4). Dos aristas son paralelas al segmento de línea especificado; cada arista tiene la mitad del ancho de la línea del segmento de línea: una arriba y otra abajo. Los otros dos bordes pasan por los puntos finales del segmento y son perpendiculares a la dirección del segmento especificado.

El bit de cobertura del punto de muestreo que intersecta el rectángulo es 1 y los demás bits de cobertura son 0. Los valores de salida de las variables de variación del sombreador de vértices y los valores de profundidad se obtienen interpolando los valores en las posiciones de muestreo correspondientes en la Ecuación 3.1, y los resultados obtenidos se utilizan para calcular los valores en la Ecuación 3.2. Las implementaciones pueden utilizar el valor de la misma variable variable en más de un valor de muestra.

No todos los anchos necesitan admitir muestreo múltiple de segmentos de línea, pero los segmentos de línea con un ancho de 1,0 deben admitirlo. Al igual que el ancho de un punto, una implementación GL puede consultar el rango y la serie de anchos de segmentos de línea multimuestreados.