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

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 mediante rasterización conservadora, como aparecería en el rasterizador (es decir, usando coordenadas de vértice de punto fijo 16,8). El área marrón se conoce como una "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 es conservador con respecto a las coordenadas de vértice 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 superior izquierda", que entra en juego cuando 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á.

la regla superior izquierda

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 de la misma manera 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 se debe usar la precisión del rasterizador.

Los píxeles que no se tratarían si el hardware usaba coordenadas de vértice 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 apretada especificada en el nivel 2. Tenga en cuenta que este requisito impide que los triángulos de sliver se extiendan más allá de lo necesario.

También se aplica InnerCoverage una región de incertidumbre válida similar, pero es más estricta, ya que ninguna implementación requiere una región de incertidumbre mayor para este caso. Consulte Interacción de InnerCoverage para obtener más detalles.

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 en coordenadas de punto fijo 16,8. 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 de punto fijo 16,8). Las dimensiones de este cuadrado se basan en el tamaño válido de la 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 sobreestimada, los cuadrados negros sólidos representan el cuadrado que se barrió a lo largo de los bordes primitivos y el área azul checkered es la región de incertidumbre externa:

región de incertidumbre externa.

Interacción de muestreo múltiple

Independientemente del número de muestras de renderTarget/DepthStencil surfaces (o si ForcedSampleCount se está usando o no), todas las muestras se tratan para píxeles rasterizados por la rasterización conservadora. Las ubicaciones de muestra individuales no se prueban si se encuentran en el primitivo o no.

Interacción de SampleMask

El estado de rasterizador SampleMask se aplica de la misma manera que cuando la rasterización conservadora no está habilitada para InputCoverage, pero no afecta InnerCoverage (es decir, no está en and'ed en una entrada declarada con InnerCoverage). Esto se debe InnerCoverage a que no está relacionado con si las muestras de MSAA se enmascaran: 0 InnerCoverage solo significa que no se garantiza que el píxel esté completamente cubierto, no que no se actualice ninguna muestra.

Interacción de prueba de profundidad/galería de símbolos

Las pruebas de profundidad y galería de símbolos continúan para un píxel rasterizado de forma conservadora del mismo modo 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 extrapolación de profundidad no está definido. Esto se debe a que algún hardware de selección de profundidad temprana no puede admitir correctamente valores de profundidad extrapolados. Sin embargo, el comportamiento de selección de profundidad temprana en presencia de 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ínima y máxima del primitivo que se rasteriza y escribe ese valor oDepth en (el 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 informar InputCoverage con precisión como se especifica en la InputCoverage sección de interacción. Por lo tanto, la cobertura del informe de píxeles totalmente no cubiertos es 0.

Interacción de cobertura de salida

La cobertura de salida (oMask) se comporta para un píxel rasterizado de forma conservadora, ya que cuando la rasterización conservadora no está habilitada con todos los ejemplos cubiertos.

Interacción de InputCoverage

En el modo de rasterización conservador, este registro de entrada se rellena como si todas las muestras se tratara 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 ) y los primeros n bits de la LSB se establecen en InputCoverage 1 para un píxel rasterizado conservadormente, dado un n ejemplo por píxel RenderTarget y/o DepthStencil enlazados en la fusión de salida o en un ejemplo 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 Sistema generar valor disponible: InnerCoverage. Se trata de un campo de bits que tiene un bit 0 del LSB establecido en 1 para un píxel rasterizado conservadormente determinado, 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 subestimada. 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 draw actual. No debe haber falsos positivos (establecer InnerCoverage bits cuando el píxel no está totalmente cubierto para cualquier error de ajuste en resoluciones mayores o iguales que la resolución en la que funciona el draw actual), pero se permiten falsos negativos. En resumen, la implementación no debe identificar incorrectamente píxeles como totalmente cubiertos que no estarían con coordenadas de vértice de punto flotante completo en el rasterizador.

Los píxeles que estarían totalmente cubiertos si el hardware usaba coordenadas de vértice 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 interior de la región de incertidumbre interna deben marcarse como totalmente cubiertos. El límite interno de la región de incertidumbre se ilustra 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értice de punto flotante a coordenadas de vértice 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 de punto fijo 16,8). Las dimensiones de este cuadrado se basan en el tamaño válido de la 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 barrió a lo largo de los bordes primitivos y el área con control naranja es la región de incertidumbre interna:

incertidumbre interna reqion.

El uso de InnerCoverage no afecta a si un píxel se rasteriza de forma conservadora, es decir, el uso de uno de estos InputCoverage modos no afecta a qué píxeles se rasterizan cuando está habilitado el modo de rasterización conservador. Por lo tanto, cuando InnerCoverage se usa 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án muestras.

Esta entrada es mutuamente excluyente con InputCoverage : ambos no se pueden usar.

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 (la interpolación no se aplica).

El InnerCoverage campo de bits 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 cambian y continúan de la misma manera que cuando la rasterización conservadora no está habilitada, donde se usan los vértices convertidos en ventanilla y convertidos en punto fijo. Dado que todas las muestras de un píxel rasterizado conservadormente se consideran cubiertas, es válida para que los valores se extrapolen, de forma 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. 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 estado de rasterizador DepthClipEnable se establece en FALSE), puede haber variaciones en la interpolación de atributos para segmentos de un primitivo que se encuentra fuera del intervalo 0 <= z = w <, dependiendo de la implementación: se usan valores constantes desde un punto en el que 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 la ventanilla. El comportamiento de interpolación de atributos dentro del intervalo 0 <= z <= w debe permanecer sin cambios.

Interacción de distancia de recorte

La distancia de recorte es válida cuando el modo de rasterización conservador está habilitado y se comporta para un píxel rasterizado de forma conservadora, como sucede cuando la rasterización conservadora no está habilitada con todas las muestras cubiertas.

Tenga en cuenta que la rasterización conservadora puede causar 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 ha sido Perspectiva dividida por un valor W no válido. Las implementaciones de Clip Distance deben protegerse contra la invocación de rasterización para píxeles en los que 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

En el caso de un píxel rasterizado conservador, las consultas se comportan como lo hacen cuando la rasterización conservadora no está habilitada cuando se tratan todas las muestras. Por ejemplo, para un píxel rasterizado conservadormente, 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 el modo de rasterización conservador.

Interacción con el estado de selección

Todos los estados 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 a través de 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 IsFrontFace sistema.

Interacción de IsFrontFace

El valor generado por el IsFrontFace 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 los bordes de triángulo en líneas y seguir las reglas de rasterización de línea y el comportamiento conservador de rasterización de línea no se ha definido.

Detalles de la implementación

El tipo de rasterización admitido en Direct3D 12 a veces se conoce como "Rasterización conservadora sobrestimada". También existe el concepto de "Rasterización conservadora subestimada", lo que significa que solo los píxeles que están totalmente cubiertos por un primitivo representado se rasterizan. La información de rasterización conservadora subestimada está disponible a través del sombreador de píxeles mediante el uso de datos de cobertura de entrada, y solo la rasterización conservadora sobrestimada está disponible 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 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 generar 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értice 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 la evaluación de cobertura en vértices post-acoplados (es decir, coordenadas de vértices 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), puede o no ser eliminado; ambos son comportamientos válidos. Los triángulos degenerados se deben considerar 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 el frente frontal. Los triángulos degenerados usan los valores asignados a vértices 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 de incertidumbre máxima de 1/2 píxeles y no admite degenerados posteriores al ajuste. Esto es bueno para la representación en mosaicos, un atlas de texturas, la generación de mapas de luz y los 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 no se puedan seleccionar. 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 al lenguaje SV_InnerCoverage de sombreado de alto nivel (HLSL). Se trata de un entero escalar de 32 bits que se puede especificar en la entrada en un sombreador de píxeles y representa la información de rasterización conservadora subestimada (es decir, si un píxel está garantizado para estar totalmente cubierto). Este nivel es útil para la selección de oclusión.

API summary

Los métodos, estructuras, enumeraciones y clases auxiliares siguientes hacen referencia a rasterización conservadora:

Tutoriales de vídeo de aprendizaje avanzado de DirectX: Rasterización conservadora

Vistas ordenadas por el rasterizador

Representación