Rasterización conservadora de Direct3D 12
La rasterización conservadora agrega cierta certeza a la representación de píxeles, lo que resulta útil en particular para los algoritmos de detección de colisiones.
- información general
-
interacciones con el de canalización
- interacción de reglas de rasterización
- interacción de muestreo múltiple
- de interacción sampleMask
- interacción de la prueba de profundidad/galería de símbolos
- de interacción de píxeles del asistente de
- interacción de cobertura de salida
- de interacción inputCoverage de
- interacción innerCoverage
- interacción de interpolación de atributos
- de interacción de recorte
- interacción de la distancia de recorte
- interacción de rasterización independiente de destino
- interacción de topología primitiva de IA
- de interacción de consultas de
- de interacción con el estado cull
- de interacción de IsFrontFace
- interacción de los modos de relleno
- detalles de implementación
- resumen de la API de
- temas relacionados
Visión general
La rasterización conservadora significa que todos los píxeles que están al menos parcialmente cubiertos por un primitivo representado se rasterizan, lo que significa que se invoca el sombreador de píxeles. El comportamiento normal es el muestreo, que no se usa si está habilitada la rasterización conservadora.
La rasterización conservadora es útil en varias situaciones, incluida la certeza en la detección de colisiones, la selección de oclusión y la representación en mosaicos.
Por ejemplo, en la ilustración siguiente se muestra un triángulo verde representado con rasterización conservadora, como aparecería en el rasterizador (es decir, con coordenadas de vértice de punto fijo 16,8). El área marrón se conoce como "región de incertidumbre": una región conceptual que representa los límites extendidos del triángulo, necesario para garantizar que el primitivo del rasterizador sea conservador con respecto a las coordenadas de vértices de punto flotante originales. Los cuadrados rojos de cada vértice muestran cómo se calcula la región de incertidumbre: como cuadrado barrido.
Los cuadrados grises grandes muestran los píxeles que se representarán. Los cuadrados rosas muestran píxeles representados mediante la "regla deTop-Left", que entra en juego mientras el borde del triángulo cruza el borde de los píxeles. Puede haber falsos positivos (píxeles establecidos que no deberían haber sido) que el sistema normalmente pero no siempre seleccionará.
Interacciones con la canalización
Interacción de reglas de rasterización
En el modo de rasterización conservador, las reglas de rasterización se aplican del mismo modo que cuando el modo de rasterización conservador no está habilitado con excepciones para la regla de Top-Left, descrita anteriormente y cobertura de píxeles. 16.8 Fixed-Point precisión del rasterizador debe utilizarse.
Los píxeles que no se tratarían si el hardware usaba coordenadas de vértices de punto flotante completo solo se pueden incluir si se encuentran dentro de una región de incertidumbre que no supera la mitad de un píxel en el dominio de punto fijo. Se espera que el hardware futuro alcance la región de incertidumbre estrecha especificada en el nivel 2. Tenga en cuenta que este requisito impide que los triángulos sliver se extiendan más allá de lo necesario.
Una región de incertidumbre válida similar también se aplica a InnerCoverage
, pero es más estricta, ya que ninguna implementación requiere una región de incertidumbre mayor para este caso. Consulte de interacción de InnerCoverage para obtener más información.
Las regiones de incertidumbre interna y externa deben ser mayores o iguales que el tamaño de la mitad de la cuadrícula de sub píxeles, o 1/512 de un píxel, en el dominio de punto fijo. Esta es la región de incertidumbre mínima válida. 1/512 procede de la representación de coordenadas de rasterizador de punto fijo 16.8 y de la regla de punto a punto más cercano que se aplica al convertir coordenadas de vértice de punto flotante a 16,8 coordenadas fijas de punto. 1/512 puede cambiar si cambia la precisión del rasterizador. Si una implementación implementa esta región de incertidumbre mínima, debe seguir la regla de Top-Left cuando un borde o esquina de la región de incertidumbre cae a lo largo del borde o la esquina de un píxel. Los bordes recortados de la región de incertidumbre deben tratarse como el vértice más cercano, lo que significa que cuenta como dos bordes: los dos que se unen en el vértice asociado. Top-Left Regla es necesaria cuando se usa la región de incertidumbre mínima porque, si no es así, una implementación de rasterización conservadora no podría rasterizar píxeles que podrían cubrirse cuando el modo de rasterización conservador está deshabilitado.
En el diagrama siguiente se muestra una región de incertidumbre externa válida producida por el barrido de un cuadrado alrededor de los bordes del primitivo en el dominio de punto fijo (es decir, los vértices se han cuantificado por la representación fija de punto 16,8). Las dimensiones de este cuadrado se basan en el tamaño válido de región de incertidumbre externa: para el 1/2 de un píxel, el cuadrado es de 1 píxel en ancho y alto, para 1/512 de un píxel, el cuadrado es 1/256 de un píxel en ancho y alto. El triángulo verde representa un primitivo determinado, la línea de puntos rojos representa el límite de rasterización conservadora sobrestimada, los cuadrados negros sólidos representan el cuadrado que se arrastra a lo largo de los bordes primitivos y el área azul checkered es la región de incertidumbre externa:
Interacción de muestreo múltiple
Independientemente del número de muestras de RenderTarget/DepthStencil superficies (o si se usa o no ForcedSampleCount), todas las muestras se tratan para píxeles rasterizados por rasterización conservadora. Las ubicaciones de ejemplo individuales no se prueban si se encuentran en el primitivo o no.
Interacción de SampleMask
El SampleMask Estado de rasterizador se aplica de la misma manera que cuando la rasterización conservadora no está habilitada para InputCoverage
, pero no afecta a InnerCoverage
(es decir, no se trata de AND en una entrada declarada con InnerCoverage
). Esto se debe a que InnerCoverage
no está relacionado con si las muestras de MSAA están enmascaradas: 0 InnerCoverage
solo significa que el píxel no está totalmente cubierto, no que no se actualice ninguna muestra.
Interacción de la prueba de profundidad/galería de símbolos
La prueba de profundidad/galería de símbolos continúa con un píxel rasterizado de forma conservadora de la misma manera que si todas las muestras se tratan cuando la rasterización conservadora no está habilitada.
Continuar con todas las muestras cubiertas puede provocar la extrapolación de profundidad, que es válida y debe ser sujetada a la ventanilla tal como se especifica cuando la rasterización conservadora no está habilitada. Esto es similar a cuando se usan modos de interpolación de frecuencia de píxeles en un RenderTarget con un recuento de muestras mayor que 1, aunque en el caso de rasterización conservadora, es el valor de profundidad que entra en la prueba de profundidad de función fija que se puede extrapolar.
El comportamiento de selección de profundidad temprana con la extrapolación de profundidad no está definido. Esto se debe a que algunos hardware de selección de profundidad temprana no pueden admitir correctamente valores de profundidad extrapolados. Sin embargo, el comportamiento de selección de profundidad temprana en presencia de la extrapolación de profundidad es problemático incluso con hardware que puede admitir valores de profundidad extrapolados. Este problema se puede solucionar fijando la profundidad de entrada del sombreador de píxeles en los valores de profundidad mínimo y máximo del primitivo que se está rasterizando y escribiendo ese valor en oDepth
(registro de profundidad de salida del sombreador de píxeles). Las implementaciones son necesarias para deshabilitar la selección de profundidad temprana en este caso, debido a la oDepth
escritura.
Interacción de píxeles auxiliares
Las reglas de píxeles auxiliares se aplican de la misma manera que cuando la rasterización conservadora no está habilitada. Como parte de esto, todos los píxeles, incluidos los píxeles auxiliares, deben notificar InputCoverage
con precisión, tal como se especifica en la sección de interacción de InputCoverage
. Por lo tanto, los píxeles no cubiertos informan de cobertura 0.
Interacción de cobertura de salida
La cobertura de salida (oMask
) se comporta para un píxel rasterizado de forma conservadora, como cuando la rasterización conservadora no está habilitada con todas las muestras cubiertas.
Interacción de InputCoverage
En el modo de rasterización conservadora, este registro de entrada se rellena como si todos los ejemplos se trataron cuando la rasterización conservadora no está habilitada para un píxel rasterizado conservador determinado. Es decir, todas las interacciones existentes se aplican (por ejemplo, sampleMask se aplica) y los primeros n bits de InputCoverage
desde el LSB se establecen en 1 para un píxel rasterizado conservador, dado un n ejemplo por píxel RenderTarget y/o depthStencil búfer enlazado en el fusión de salida, o un ejemplo n ForcedSampleCount. El resto de los bits son 0.
Esta entrada está disponible en un sombreador, independientemente del uso de rasterización conservadora, aunque la rasterización conservadora cambia su comportamiento para mostrar solo todas las muestras cubiertas (o ninguna para píxeles auxiliares).
Interacción de InnerCoverage
Esta característica es necesaria y solo está disponible en el nivel 3. El tiempo de ejecución producirá un error en la creación del sombreador para los sombreadores que usan este modo cuando una implementación admita un nivel inferior al nivel 3.
El sombreador de píxeles tiene un entero escalar de 32 bits Disponible: InnerCoverage
. Se trata de un campo de bits que tiene un bit 0 del LSB establecido en 1 para un píxel rasterizado determinado de forma conservadora, solo cuando se garantiza que ese píxel esté completamente dentro del primitivo actual. Todos los demás bits de registro de entrada deben establecerse en 0 cuando no se establece el bit 0, pero no están definidos cuando el bit 0 se establece en 1 (básicamente, este campo de bits representa un valor booleano donde false debe ser exactamente 0, pero true puede ser cualquier valor impar (es decir, bit 0 set) distinto de cero). Esta entrada se usa para la información de rasterización conservadora infravalorada. Informa al Sombreador de píxeles si el píxel actual se encuentra completamente dentro de la geometría.
Esto debe tener en cuenta el error de ajuste en resoluciones mayores o iguales que la resolución en la que funciona el dibujo actual. No debe haber falsos positivos (establecer InnerCoverage
bits cuando el píxel no está totalmente cubierto para ningún error de ajuste en resoluciones mayores o iguales que la resolución en la que funciona el dibujo actual), pero se permiten falsos negativos. En resumen, la implementación no debe identificar incorrectamente los píxeles como totalmente cubiertos que no estarían con coordenadas de vértices de punto flotante completo en el rasterizador.
Los píxeles que estarían completamente cubiertos si el hardware usaba coordenadas de vértices de punto flotante completo solo se pueden omitir si intersecan la región de incertidumbre interna, que no debe ser mayor que el tamaño de la cuadrícula de sub píxeles o 1/256 de un píxel, en el dominio de punto fijo. Dicho de otra manera, los píxeles completamente dentro del límite interno de la región de incertidumbre interna deben marcarse como totalmente cubiertos. El límite interno de la región de incertidumbre se muestra en el diagrama siguiente mediante la línea de puntos negros negrita. 1/256 procede de la representación de coordenada de rasterizador de punto fijo 16.8, que puede cambiar si cambia la precisión del rasterizador. Esta región de incertidumbre es suficiente para tener en cuenta el error de ajuste causado por la conversión de coordenadas de vértices de punto flotante a coordenadas de vértices de punto fijo en el rasterizador.
Los mismos requisitos mínimos de la región de incertidumbre 1/512 definidos en la interacción de reglas de rasterización también se aplican aquí.
En el diagrama siguiente se muestra una región de incertidumbre interna válida producida por el barrido de un cuadrado alrededor de los bordes del primitivo en el dominio de punto fijo (es decir, los vértices se han cuantificado por la representación fija de punto 16,8). Las dimensiones de este cuadrado se basan en el tamaño válido de región de incertidumbre interna: para 1/256 de un píxel, el cuadrado es 1/128 de un píxel en ancho y alto. El triángulo verde representa un primitivo determinado, la línea de puntos negros negrita representa el límite de la región de incertidumbre interna, los cuadrados negros sólidos representan el cuadrado que se arrastra a lo largo de los bordes primitivos, y el área con checkered naranja es la región de incertidumbre interna:
El uso de InnerCoverage
no afecta a si un píxel está rasterizado de forma conservadora, es decir, el uso de uno de estos modos de InputCoverage
no afecta a qué píxeles se rasterizan cuando está habilitado el modo de rasterización conservador. Por lo tanto, cuando se usa InnerCoverage
y el Sombreador de píxeles está procesando un píxel que no está completamente cubierto por la geometría, su valor será 0, pero la invocación del sombreador de píxeles tendrá muestras actualizadas. Esto es diferente de cuando InputCoverage
es 0, lo que significa que no se actualizará ninguna muestra.
Esta entrada es mutuamente excluyente con InputCoverage
: no se pueden usar ambos.
Para acceder a InnerCoverage
, debe declararse como un único componente fuera de uno de los registros de entrada del sombreador de píxeles. El modo de interpolación de la declaración debe ser constante (no se aplica la interpolación).
El campo de bits de InnerCoverage
no se ve afectado por las pruebas de profundidad o galería de símbolos, ni se andida con el estado SampleMask Rasterizer.
Esta entrada solo es válida en el modo de rasterización conservador. Cuando la rasterización conservadora no está habilitada, InnerCoverage
genera un valor indefinido.
Las invocaciones del sombreador de píxeles causadas por la necesidad de píxeles auxiliares, pero, de lo contrario, no cubiertos por el primitivo, deben tener el InnerCoverage
registro establecido en 0.
Interacción de interpolación de atributos
Los modos de interpolación de atributos no se modifican y continúan de la misma manera que cuando no está habilitada la rasterización conservadora, donde se usan los vértices convertidos en ventanilla y convertidos en punto fijo. Dado que todos los ejemplos de un píxel rasterizado conservador se consideran cubiertos, es válido para que los valores se extraen, de forma similar a cuando se usan modos de interpolación de frecuencia de píxeles en un renderTarget con el recuento de muestras mayor que 1. Los modos de interpolación centroide producen resultados idénticos al modo de interpolación no centroide correspondiente; la noción de centroide no tiene sentido en este escenario, donde la cobertura de muestra solo es completa o 0.
La rasterización conservadora permite que los triángulos degenerados generen invocaciones del sombreador de píxeles, por lo tanto, los triángulos degenerados deben usar los valores asignados a Vértice 0 para todos los valores interpolados.
Interacción de recorte
Cuando el modo de rasterización conservador está habilitado y el clip de profundidad está deshabilitado (cuando el DepthClipEnable Estado de rasterizador se establece en FALSE), puede haber variaciones en la interpolación de atributos para segmentos de un primitivo que se encuentran fuera de la <= z <= w range, dependiendo de la implementación: los valores constantes se usan desde un punto donde el primitivo interseca el plano pertinente (cerca o lejos), o la interpolación de atributos se comporta como cuando el modo de rasterización conservador está deshabilitado. Sin embargo, el comportamiento del valor de profundidad es el mismo independientemente del modo de rasterización conservador, es decir, los primitivos que se encuentran fuera del intervalo de profundidad deben seguir teniendo el valor del límite más cercano del intervalo de profundidad de ventanilla. El comportamiento de interpolación de atributos dentro de la <0 = z <= w range debe permanecer sin cambios.
Interacción de distancia de clip
Clip Distance es válido cuando el modo de rasterización conservador está habilitado y se comporta para un píxel rasterizado de forma conservadora, como cuando la rasterización conservadora no está habilitada con todos los ejemplos cubiertos.
Tenga en cuenta que la rasterización conservadora puede provocar la extrapolación de la coordenada del vértice W, lo que puede causar W <= 0. Esto podría hacer que las implementaciones de distancia de clip por píxel funcionen en una distancia de clip que se ha dividido en perspectiva dividido por un valor W no válido. Las implementaciones de distancia de clip deben protegerse contra la invocación de rasterización para píxeles donde la coordenada de vértice W <= 0 (por ejemplo, debido a la extrapolación cuando se encuentra en modo de rasterización conservador).
Interacción de rasterización independiente de destino
El modo de rasterización conservador es compatible con la rasterización independiente de destino (TIR). Se aplican reglas y restricciones TIR, que se comportan para un píxel rasterizado conservadormente como si se tratara todas las muestras.
Interacción de topología primitiva de IA
La rasterización conservadora no está definida para primitivos de línea o punto. Por lo tanto, las topologías primitivas que especifican puntos o líneas producen un comportamiento indefinido si se alimentan a la unidad de rasterizador cuando está habilitada la rasterización conservadora.
La validación de la capa de depuración comprueba que las aplicaciones no usan estas topologías primitivas.
Interacción de consultas
Para un píxel rasterizado conservadormente, las consultas se comportan como cuando la rasterización conservadora no está habilitada cuando se tratan todos los ejemplos. Por ejemplo, para un píxel rasterizado conservador, D3D12_QUERY_TYPE_OCCLUSION y D3D12_QUERY_TYPE_PIPELINE_STATISTICS (de D3D12_QUERY_TYPE) deben comportarse como lo harían cuando la rasterización conservadora no está habilitada cuando se tratan todas las muestras.
Las invocaciones del sombreador de píxeles deben incrementarse para cada píxel rasterizado conservador en modo de rasterización conservador.
Interacción con el estado de selección
Todos los estados de cull son válidos en el modo de rasterización conservador y siguen las mismas reglas que cuando la rasterización conservadora no está habilitada.
Al comparar la rasterización conservadora entre resoluciones a sí misma o sin la rasterización conservadora habilitada, existe la posibilidad de que algunos primitivos tengan caras no coincidentes (es decir, una cara posterior, la otra frontal). Las aplicaciones pueden evitar esta incertidumbre mediante D3D12_CULL_MODE_NONE (de D3D12_CULL_MODE) y no usar el valor generado por el sistema de IsFrontFace
.
Interacción con IsFrontFace
El IsFrontFace
valor generado por el sistema es válido para usarlo en el modo de rasterización conservador y sigue el comportamiento definido cuando la rasterización conservadora no está habilitada.
Interacción de modos de relleno
El único D3D12_FILL_MODE válido para la rasterización conservadora es D3D12_FILL_SOLID, cualquier otro modo de relleno es un parámetro no válido para el estado de rasterizador.
Esto se debe a que la especificación funcional D3D12 especifica que el modo de relleno de trama de alambre debe convertir bordes de triángulo en líneas y seguir las reglas de rasterización de líneas y el comportamiento conservador de rasterización de línea no se ha definido.
Detalles de implementación
El tipo de rasterización admitido en Direct3D 12 se conoce a veces como "Rasterización conservadora sobrestimada". También existe el concepto de "Rasterización conservadora infravalorada", lo que significa que solo los píxeles que están completamente cubiertos por un primitivo representado se rasterizan. La información de rasterización conservadora infravalorada está disponible a través del sombreador de píxeles mediante el uso de datos de cobertura de entrada y solo está disponible una rasterización conservadora excesiva como modo de rasterización.
Si alguna parte de un primitivo se superpone a un píxel, ese píxel se considera cubierto y, a continuación, se rasteriza. Cuando un borde o esquina de un primitivo cae a lo largo del borde o la esquina de un píxel, la aplicación de la "regla superior izquierda" es específica de la implementación. Sin embargo, para las implementaciones que admiten triángulos degenerados, un triángulo degenerado a lo largo de un borde o esquina debe cubrir al menos un píxel.
Las implementaciones de rasterización conservadoras pueden variar en hardware diferente y producen falsos positivos, lo que significa que pueden decidir incorrectamente que los píxeles están cubiertos. Esto puede ocurrir debido a detalles específicos de la implementación, como los errores primitivos de crecimiento o ajuste inherentes a las coordenadas de vértices de punto fijo que se usan en la rasterización. La razón por la que los falsos positivos (con respecto a las coordenadas de vértices de punto fijo) son válidos es porque se necesita cierta cantidad de falsos positivos para permitir que una implementación realice una evaluación de cobertura con vértices posteriores (es decir, coordenadas de vértices que se han convertido de punto flotante al punto fijo 16,8 usado en el rasterizador), pero respeta la cobertura producida por las coordenadas de vértices de punto flotante originales.
Las implementaciones de rasterización conservadoras no producen falsos negativos con respecto a las coordenadas de vértice de punto flotante para primitivos posteriores a la rásterización no degenerados: si alguna parte de un primitivo se superpone a cualquier parte de un píxel, ese píxel se rasteriza.
Triángulos que se degeneran (índices duplicados en un búfer de índice o collinear en 3D) o se degeneran después de la conversión de punto fijo (vértices collineares en el rasterizador), pueden o no eliminarse; ambos son comportamientos válidos. Los triángulos degenerados deben considerarse orientados hacia atrás, por lo que si una aplicación requiere un comportamiento específico, puede usar la selección de caras traseras o la prueba para la cara frontal. Los triángulos degenerados usan los valores asignados al vértice 0 para todos los valores interpolados.
Hay tres niveles de compatibilidad con hardware, además de la posibilidad de que el hardware no admita esta característica.
- El nivel 1 aplica una región máxima de incertidumbre de 1/2 píxeles y no admite degenerados posteriores al ajuste. Esto es bueno para la representación en mosaicos, un atlas de textura, una generación de mapas de luz y mapas de sombras de sub píxeles.
- El nivel 2 reduce la región de incertidumbre máxima a 1/256 y requiere que los degenerados posteriores al ajuste no se puedan eliminar. Este nivel es útil para la aceleración de algoritmos basados en CPU (como la voxelización).
- El nivel 3 mantiene una región de incertidumbre máxima de 1/256 y agrega compatibilidad con la cobertura de entrada interna. La cobertura de entrada interna agrega el nuevo valor
SV_InnerCoverage
al lenguaje de sombreado de alto nivel (HLSL). Se trata de un entero escalar de 32 bits que se puede especificar en la entrada a un sombreador de píxeles y representa la información de rasterización conservadora infravalorada (es decir, si se garantiza un píxel,to-betotalmente cubierto). Este nivel es útil para la selección de oclusión.
Resumen de LA API
Los métodos, estructuras, enumeraciones y clases auxiliares siguientes hacen referencia a rasterización conservadora:
- D3D12_RASTERIZER_DESC : estructura que contiene la descripción del rasterizador.
- D3D12_CONSERVATIVE_RASTERIZATION_MODE : valores de enumeración para el modo (activado o desactivado).
- D3D12_FEATURE_DATA_D3D12_OPTIONS : estructura que contiene el nivel de soporte técnico.
- D3D12_CONSERVATIVE_RASTERIZATION_TIER : valores de enumeración para cada nivel de soporte técnico del hardware.
- CheckFeatureSupport : método para acceder a las características admitidas.
- CD3DX12_RASTERIZER_DESC : clase auxiliar para crear descripciones de rasterizador.
Temas relacionados
-
tutoriales de vídeo de aprendizaje avanzado de DirectX: de rasterización conservadora