Compartir a través de


Sombreado de velocidad variable (VRS)

La motivación de VRS

Debido a las restricciones de rendimiento, un representador de gráficos no siempre puede permitirse ofrecer el mismo nivel de calidad a todas las partes de su imagen de salida. Sombreado de velocidad variable (o sombreado de píxeles gruesos) es un mecanismo que permite asignar rendimiento o potencia de representación a velocidades que varían en toda la imagen representada.

En algunos casos, la velocidad de sombreado se puede reducir con poca o ninguna reducción en la calidad de salida perceptible; que conduce a una mejora del rendimiento que esencialmente es gratuita.

Sin VRS: suavizado multimuestreo con supermuestreo

Sin sombreado de velocidad variable, el único medio de controlar la velocidad de sombreado es con suavizado de varias muestras (MSAA) con ejecución basada en muestras (también conocida como supermuestreo).

MSAA es un mecanismo para reducir el alias geométrico y mejorar la calidad de representación de una imagen en comparación con no usar MSAA. El recuento de muestras de MSAA, que puede ser 1x, 2x, 4x, 8x o 16x, rige el número de muestras asignadas por píxel de destino de representación. El recuento de muestras de MSAA debe conocerse por adelantado cuando se asigna el destino y no se puede cambiar después.

El supermuestreo hace que el sombreador de píxeles se invoque una vez por muestra, con una mayor calidad, pero también un mayor costo de rendimiento en comparación con la ejecución por píxel.

La aplicación puede controlar su velocidad de sombreado eligiendo entre la ejecución basada en píxeles o el muestreo de MSAA con supermuestreo. Estas dos opciones no proporcionan un control muy fino. Además, es posible que desee una tasa de sombreado inferior para una determinada clase de objetos en comparación con el resto de la imagen. Estos objetos pueden incluir un objeto detrás de un elemento HUD, o una transparencia, un desenfoque (profundidad de campo, movimiento, etc.) o una distorsión óptica debido a la óptica vr. Pero eso no sería posible, ya que la calidad de sombreado y los costos se fijan en toda la imagen.

Con sombreado de velocidad variable (VRS)

El modelo de sombreado de velocidad variable (VRS) amplía el supermuestreo con MSAA en el contrario, "píxel general", dirección, agregando el concepto de sombreado grueso. Aquí es donde el sombreado se puede realizar con una frecuencia más gruesa que un píxel. En otras palabras, un grupo de píxeles se puede sombrear como una sola unidad y, a continuación, el resultado se transmite a todas las muestras del grupo.

Una API de sombreado general permite a la aplicación especificar el número de píxeles que pertenecen a un grupo sombreado o píxeles generales. Puede variar el tamaño de píxel general después de asignar el destino de representación. Por lo tanto, diferentes partes de la pantalla o diferentes pases de dibujo pueden tener diferentes velocidades de sombreado.

A continuación se muestra una tabla que describe qué nivel de MSAA se admite con qué tamaño de píxel general, para las plataformas que admiten sombreado general:

  • Para las celdas marcadas Y, esa combinación está habilitada.
  • Para las celdas marcadas Cap, esa combinación está habilitada condicionalmente en función de un límite (AdditionalShadingRatesSupported).
  • En el caso de las celdas que están en blanco, esa combinación no es compatible.
  • En el caso de las celdas sombreadas por medio tono, esa combinación no es compatible, y implica el seguimiento de más de 16 muestras por invocación de sombreador de píxeles. Para realizar el seguimiento de más de 16 ejemplos, hay barreras adicionales de alineación de hardware para admitir, en comparación con los otros casos.

Tabla muestra el tamaño de píxel general para los niveles de M S A A.

Niveles de características

Hay dos niveles en la implementación de VRS y dos funcionalidades para las que puede consultar. Cada nivel se describe con más detalle después de la tabla.

Tabla muestra las características disponibles en el nivel 1 y el nivel 2.

Nivel 1

  • La tasa de sombreado solo se puede especificar por sorteo; no más granular que eso.
  • La velocidad de sombreado se aplica uniformemente a lo que se dibuja independientemente de dónde se encuentra dentro del destino de representación.

Nivel 2

  • La velocidad de sombreado se puede especificar por sorteo, como en el nivel 1. También se puede especificar mediante una combinación de base por dibujo y de:
    • Semántica de cada vértice que provoca y
    • una imagen de espacio de pantalla.
  • Las tasas de sombreado de los tres orígenes se combinan mediante un conjunto de combinadores.
  • El tamaño del icono de imagen de espacio de pantalla es de 16 x 16 o más pequeño.
  • Se garantiza que la tasa de sombreado solicitada por la aplicación se entregue exactamente (para precisión de los filtros temporales y de reconstrucción).
  • se admite SV_ShadingRate entrada de PS.
  • La velocidad de sombreado por cada vértice (también conocida como por primitivo), es válida cuando se usa una ventanilla y no se escribe SV_ViewportArrayIndex.
  • La tasa de vértices por causa se puede usar con más de una ventanilla si la SupportsPerVertexShadingRateWithMultipleViewports funcionalidad se establece en true. Además, en ese caso, esa tasa se puede usar cuando se escribe SV_ViewportArrayIndex.

Lista de funcionalidades

  • additionalShadingRatesSupported
    • Tipo booleano.
    • Indica si se admiten tamaños de píxeles 2x4, 4x2 y 4 x 4 píxeles generales para la representación de muestra única; y si se admite el tamaño de píxel general 2x4 para 2x MSAA.
  • SupportsPerVertexShadingRateWithMultipleViewports
    • Tipo booleano.
    • Indica si se puede usar más de una ventanilla con la velocidad de sombreado por vértice (también conocida como por primitivo).

Especificación de la velocidad de sombreado

Para obtener flexibilidad en las aplicaciones, hay una variedad de mecanismos que se proporcionan para controlar la velocidad de sombreado. Hay diferentes mecanismos disponibles en función del nivel de característica de hardware.

Lista de comandos

Este es el mecanismo más sencillo para establecer la velocidad de sombreado. Está disponible en todos los niveles.

La aplicación puede especificar un tamaño de píxel general mediante el método ID3D12GraphicsCommandList5::RSSetShadingRate. Esa API toma un único argumento de enumeración. La API proporciona un control general del nivel de calidad para la representación, la capacidad de establecer la velocidad de sombreado por dibujo.

Los valores de este estado se expresan a través de la enumeración D3D12_SHADING_RATE.

Compatibilidad con el tamaño de píxel general

Las velocidades de sombreado 1x1, 1x2, 2x1 y 2x2 se admiten en todos los niveles.

Hay una funcionalidad, AdditionalShadingRatesSupported, para indicar si se admiten 2x4, 4x2 y 4x4 en el dispositivo.

Imagen de espacio de pantalla (basada en imágenes)

En el nivel 2 y versiones posteriores, puede especificar la velocidad de sombreado de píxeles con una imagen de espacio de pantalla.

La imagen de espacio de pantalla permite a la aplicación crear una imagen de "nivel de detalle (LOD) que indica las regiones de calidad variable, como áreas que estarán cubiertas por desenfoque de movimiento, desenfoque de profundidad de campo, objetos transparentes o elementos de interfaz de usuario de HUD. La resolución de la imagen está en macrobloqueos; no está en la resolución del destino de representación. Es decir, los datos de velocidad de sombreado se especifican con una granularidad de mosaicos de 8x8 o 16 x 16 píxeles, como se indica en el tamaño del icono VRS.

Tamaño del icono

La aplicación puede consultar una API para recuperar el tamaño de icono de VRS compatible para su dispositivo.

Los mosaicos son cuadrados y el tamaño hace referencia al ancho o alto del icono en los elementos de textura.

Si el hardware no admite sombreado de velocidad variable de nivel 2, la consulta de funcionalidad del tamaño del icono devuelve 0.

Si el de hardware admite sombreado de velocidad variable de nivel 2, el tamaño del icono es uno de estos valores.

  • 8
  • 16
  • 32

Tamaño de imagen de espacio de pantalla

Para un destino de representación de tamaño {rtWidth, rtHeight}, usando un tamaño de icono determinado denominado VRSTileSize, la imagen de espacio de pantalla que lo cubre es de estas dimensiones.

{ ceil((float)rtWidth / VRSTileSize), ceil((float)rtHeight / VRSTileSize) }

La imagen de espacio de pantalla superior izquierda (0, 0) está bloqueada en la parte superior izquierda del destino de representación (0, 0).

Para buscar la coordenada (x,y) de un icono que corresponde a una ubicación determinada en el destino de representación, divida las coordenadas del espacio de ventana de (x, y) por el tamaño del icono, ignorando los bits fraccionarios.

Si la imagen de espacio de pantalla es mayor de lo que debe ser para un destino de representación determinado, no se usan las partes adicionales de la derecha o de la parte inferior.

Si la imagen de espacio de pantalla es demasiado pequeña para un destino de representación determinado, cualquier intento de lectura de la imagen más allá de sus extensiones reales produce una velocidad de sombreado predeterminada de 1x1. Esto se debe a que la imagen de espacio de pantalla superior izquierda (0, 0) está bloqueada en la parte superior izquierda del destino de representación (0, 0) y "leer más allá de las extensiones de destino de representación" significa leer demasiado grande de valores para x e y.

Formato, diseño, propiedades de recursos

El formato de esta superficie es una superficie de 8 bits de un solo canal (DXGI_FORMAT_R8_UINT).

El recurso es la dimensión TEXTURE2D.

No se puede realizar una matriz ni un mipped. Debe tener explícitamente un nivel mip.

Tiene el recuento de muestras 1 y la calidad de la muestra 0.

Tiene diseño de textura UNKNOWN. No puede ser implícitamente un diseño principal de fila, ya que no se permite el adaptador cruzado.

La forma esperada en la que se rellenan los datos de la imagen de espacio de pantalla es para cualquiera de los dos

  1. Escribir los datos mediante un sombreador de proceso; la imagen de espacio de pantalla está enlazada como un UAV o
  2. Copie los datos en la imagen de espacio de pantalla.

Al crear la imagen de espacio en pantalla, se permiten estas marcas.

  • NINGUNO
  • ALLOW_UNORDERED_ACCESS
  • DENY_SHADER_RESOURCE

No se permiten estas marcas.

  • ALLOW_RENDER_TARGET
  • ALLOW_DEPTH_STENCIL
  • ALLOW_CROSS_ADAPTER
  • ALLOW_SIMULTANEOUS_ACCESS
  • VIDEO_DECODE_REFERENCE_ONLY

El tipo de montón del recurso no puede ser UPLOAD ni READBACK.

El recurso no se puede SIMULTANEOUS_ACCESS. No se permite que el recurso sea entre adaptadores.

Datos

Cada byte de la imagen de espacio de pantalla corresponde a un valor de la enumeración D3D12_SHADING_RATE.

Estado del recurso

Un recurso debe pasarse a un estado de solo lectura cuando se usa como una imagen de espacio de pantalla. Se define un estado de solo lectura, D3D12_RESOURCE_STATE_SHADING_RATE_SOURCE, para este propósito.

El recurso de imagen se pasa de ese estado para volver a escribirse.

Establecimiento de la imagen

La imagen de espacio de pantalla para especificar la velocidad del sombreador se establece en la lista de comandos.

Un recurso que se ha establecido como origen de velocidad de sombreado no se puede leer ni escribir desde ninguna fase del sombreador.

Se puede establecer una imagen de espacio de pantalla null para especificar la velocidad del sombreador. Esto tiene el efecto de que 1x1 se use de forma coherente como contribución de la imagen de espacio de pantalla. Inicialmente, la imagen de espacio de pantalla se puede considerar establecida en null.

Promoción y descomposición

Un recurso de imagen de espacio de pantalla no tiene implicaciones especiales con respecto a la promoción o la degradación.

Atributo por primitivo

Un atributo por primitivo agrega la capacidad de especificar un término de tasa de sombreado como un atributo de un vértice que provoca el uso de un vértice. Este atributo está sombreado plano, es decir, se propaga a todos los píxeles del triángulo actual o primitivo de línea. El uso de un atributo por primitivo puede permitir un control más preciso de la calidad de la imagen en comparación con los demás especificadores de velocidad de sombreado.

El atributo por primitivo es una semántica settable denominada SV_ShadingRate. SV_ShadingRate existe como parte de modelo de sombreador HLSL 6.4.

Si un VS o GS establece SV_ShadingRate, pero VRS no está habilitado, la configuración semántica no tiene ningún efecto. Si no se especifica ningún valor para SV_ShadingRate por primitivo, se asume un valor de velocidad de sombreado de 1x1 como contribución por primitiva.

Combinación de factores de frecuencia de sombreado

Las distintas fuentes de frecuencia de sombreado se aplican en secuencia mediante este diagrama.

Diagrama muestra un estado de canalización, con la etiqueta A, con velocidad de sombreado de vértices, etiquetada B, aplicada a un combinador y, a continuación, frecuencia de sombreado basada en imágenes, etiquetada B, aplicada en un combinador.

Cada par de A y B se combina mediante un combinador.

* Al especificar una tasa de sombreador por atributo de vértice.

  • Si se usa un sombreador de geometría, la velocidad de sombreado se puede especificar a través de eso.
  • Si no se usa un sombreador de geometría, la velocidad de sombreado se especifica mediante el vértice que provoca.

Lista de combinadores

Se admiten los siguientes combinadores. Usar un combinador (C) y dos entradas (A y B).

  • passthrough . C.xy = A.xy.
  • Invalidar. C.xy = B.xy.
  • de mayor calidad. C.xy = min(A.xy, B.xy).
  • menor calidad. C.xy = max(A.xy, B.xy).
  • Aplicar el costo B en relación con un. C.xy = min(maxRate, A.xy + B.xy).

donde maxRate es la dimensión más grande permitida de píxeles gruesos en el dispositivo. Esto sería

  • D3D12_AXIS_SHADING_RATE_2X (es decir, un valor de 1), si AdditionalShadingRatesSupported es false.
  • D3D12_AXIS_SHADING_RATE_4X (es decir, un valor de 2), si AdditionalShadingRatesSupported es true.

La elección del combinador para el sombreado de velocidad variable se establece en la lista de comandos a través de ID3D12GraphicsCommandList5::RSSetShadingRate.

Si nunca se establece ningún combinador, permanecen en el valor predeterminado, que es PASSTHROUGH.

Si el origen de un combinador es un D3D12_AXIS_SHADING_RATE, que no se permite en la tabla de soporte técnico, la entrada se sanea en una velocidad de sombreado que se admite.

Si la salida de un combinador no se corresponde con una velocidad de sombreado admitida en la plataforma, el resultado se sanea en una velocidad de sombreado que se admite.

Estado predeterminado y borrado de estado

Todas las fuentes de velocidad de sombreado, es decir,

  • la velocidad especificada por el estado de la canalización (especificada en la lista de comandos),
  • velocidad especificada por la imagen de espacio de pantalla y
  • atributo por primitivo

tienen un valor predeterminado de D3D12_SHADING_RATE_1X1. Los combinadores predeterminados son {PASSTHROUGH, PASSTHROUGH}.

Si no se especifica ninguna imagen de espacio de pantalla, se deduce una velocidad de sombreado de 1x1 de ese origen.

Si no se especifica ningún atributo por primitivo, se deduce una velocidad de sombreado de 1x1 de ese origen.

ID3D12CommandList::ClearState restablece la velocidad especificada por el estado de la canalización al valor predeterminado y la selección de la imagen de espacio en pantalla al valor predeterminado de "sin imagen de espacio de pantalla".

Consulta de la velocidad de sombreado mediante SV_ShadingRate

Es útil saber qué velocidad de sombreado seleccionó el hardware en cualquier invocación de sombreador de píxeles determinada. Esto podría habilitar una variedad de optimizaciones en el código de PS. Una variable del sistema de solo PS, SV_ShadingRate, proporciona información sobre la velocidad de sombreado.

Tipo

El tipo de esta semántica es uint.

Interpretación de datos

Los datos se interpretan como un valor de la enumeración D3D12_SHADING_RATE.

Si VRS no se está usando

Si no se usa sombreado de píxeles gruesos, SV_ShadingRate se lee como un valor de 1x1, lo que indica píxeles finos.

Comportamiento en la ejecución basada en muestras

Se produce un error en la compilación de un sombreador de píxeles si introduce SV_ShadingRate y también usa la ejecución basada en muestras, por ejemplo, mediante la entrada de SV_SampleIndexo mediante la palabra clave de interpolación de ejemplo.

Comentarios sobre sombreado diferido

Es posible que las pasadas de iluminación de una aplicación de sombreado diferida necesiten saber qué velocidad de sombreado se usó para qué área de la pantalla. Esto es para que los envíos de pasos de iluminación puedan iniciarse a una velocidad general. La variable SV_ShadingRate se puede usar para lograrlo si se escribe en el gbuffer.

Profundidad y galería de símbolos

Cuando se usa sombreado de píxeles gruesos, la profundidad y la galería de símbolos y la cobertura siempre se calculan y emiten en la resolución de muestra completa.

Uso de la velocidad de sombreado solicitada

Para todos los niveles, se espera que si se solicita una velocidad de sombreado y se admite en la combinación de nivel de dispositivo y MSAA, esa es la velocidad de sombreado que entrega el hardware.

Una velocidad de sombreado solicitada significa una velocidad de sombreado calculada como salida de los combinadores (consulte la sección Combinación de factores de frecuencia de sombreado de este tema).

Una velocidad de sombreado admitida es 1x1, 1x2, 2x1 o 2x2 en una operación de representación donde el recuento de muestras es menor o igual que cuatro. Si el funcionalidad AdditionalShadingRatesSupported es true, 2x4, 4x2 y 4x4 también se admiten tasas de sombreado para algunos recuentos de muestras (consulte la tabla del Con sombreado de velocidad variable (VRS) de este tema).

Derivados del espacio de pantalla

Los cálculos de degradados de píxel a adyacente se ven afectados por el sombreado de píxeles gruesos. Por ejemplo, cuando se usan píxeles 2x2 gruesos, un degradado será dos veces el tamaño en comparación con cuando no se usen píxeles gruesos. Es posible que la aplicación quiera ajustar los sombreadores para compensar esto, o no, en función de la funcionalidad que desee.

Dado que los mips se eligen en función de un derivado del espacio de pantalla, el uso de sombreado de píxeles gruesos afecta a la selección mip. El uso del sombreado de píxeles gruesos hace que se seleccionen mips menos detalladas en comparación con cuando no se usan píxeles gruesos.

Interpolación de atributos

Las entradas a un sombreador de píxeles se pueden interpolar en función de sus vértices de origen. Dado que el sombreado de velocidad variable afecta a las áreas del destino escritas por cada invocación del sombreador de píxeles, interactúa con la interpolación de atributos. Los tres tipos de interpolación son centro, centroide y muestra.

Centro

La ubicación de interpolación central de un píxel grueso es el centro geométrico del área completa de píxeles gruesos. SV_Position siempre se interpola en el centro de la región de píxeles gruesas.

Centroide

Cuando se usa sombreado de píxeles gruesos con MSAA, para cada píxel fino, todavía habrá escrituras en el número completo de muestras asignadas para el nivel de MSAA del destino. Por lo tanto, la ubicación de interpolación centroide considerará todas las muestras para píxeles finos dentro de píxeles gruesos. Dicho esto, la ubicación de interpolación centroide se define como la primera muestra cubierta, en orden creciente del índice de muestra. La cobertura efectiva de la muestra es AND con el bit correspondiente del estado de rasterizador SampleMask.

Nota

Cuando se usa sombreado de píxeles gruesos en el nivel 1, SampleMask siempre es una máscara completa. Si SampleMask está configurado para no ser una máscara completa, el sombreado de píxeles gruesos está deshabilitado en el nivel 1.

Ejecución basada en muestras

La ejecución basada en muestras o supermuestreo,que se debe al uso de la característica de interpolación de ejemplo, se puede usar con sombreado de píxeles gruesos y hace que el sombreador de píxeles se invoque por muestra. En el caso de los destinos del recuento de muestras N, el sombreador de píxeles se invoca N veces por píxel fino.

EvaluateAttributeSnapped

Los intrínsecos del modelo de extracción no son compatibles con sombreado de píxeles gruesos en el nivel 1. Si hay un intento de usar intrínsecos del modelo de extracción con sombreado de píxeles gruesos en el nivel 1, el sombreado de píxeles gruesos se deshabilita automáticamente.

Se permite usar el EvaluateAttributeSnapped intrínseco con sombreado de píxeles gruesos en el nivel 2. Su sintaxis es la misma que siempre ha sido.

numeric EvaluateAttributeSnapped(	
    in attrib numeric value, 
    in int2 offset);

Para el contexto, EvaluateAttributeSnapped tiene un parámetro de desplazamiento con dos campos. Cuando se usa sin sombreado de píxeles gruesos, solo se usan los cuatro bits de orden inferior de los treinta y dos completos. Estos cuatro bits representan el intervalo [-8, 7]. Este intervalo abarca una cuadrícula de 16x16 dentro de un píxel. El rango es tal que se incluyen los bordes superior e izquierdo del píxel y los bordes inferior y derecho no. El desplazamiento (-8, -8) está en la esquina superior izquierda y el desplazamiento (7, 7) está en la esquina inferior derecha. Desplazamiento (0, 0) es el centro del píxel.

Cuando se usa con sombreado de píxeles gruesos, EvaluateAttributeSnappedparámetro offset es capaz de especificar una gama más amplia de ubicaciones. El parámetro offset selecciona una cuadrícula de 16x16 para cada píxel fino y hay varios píxeles finos. El intervalo exprés y el número consecuente de bits usados dependen del tamaño de píxel general. Se incluyen los bordes superior e izquierdo del píxel grueso y los bordes inferior y derecho.

En la tabla siguiente se describe la interpretación del parámetro offset de EvaluateAttributeSnappedpara cada tamaño de píxel general.

Intervalo de desplazamiento de EvaluateAttributeSnapped

Tamaño de píxel general Intervalo indexable Tamaño de intervalo que se puede representar Número de bits necesarios {x, y} Máscara binaria de bits utilizables
1x1 (fino) {[-8, 7], [-8, 7]} {16, 16} {4, 4} {00000000000xxxx, 000000000000xxxx}
1x2 {[-8, 7], [-16, 15]} {16, 32} {4, 5} {00000000000xxxx, 0000000000xxxxx}
2x1 {[-16, 15], [-8, 7]} {32, 16} {5, 4} {000000000xxxxx, 0000000000000xxxx}
2x2 {[-16, 15], [-16, 15]} {32, 32} {5, 5} {000000000xxxxx, 00000000000xxxxx}
2x4 {[-16, 15], [-32, 31]} {32, 64} {5, 6} {000000000xxxxx, 0000000000xxxxxx}
4x2 {[-32, 31], [-16, 15]} {64, 32} {6, 5} {00000000xxxxxx, 00000000000xxxxx}
4x4 {[-32, 31], [-32, 31]} {64, 64} {6, 6} {00000000xxxxxx, 0000000000xxxxxx}

Las tablas siguientes son una guía para la conversión a desde la representación decimal y fraccionararia a punto fijo. El primer bit utilizable de la máscara binaria es el bit de signo y el resto de la máscara binaria consta de la parte numérica.

El esquema numérico para los valores de cuatro bits pasados a EvaluateAttributeSnapped no es específico del sombreado de velocidad variable. Se reitera aquí por integridad.

Para los valores de cuatro bits.

Valor binario Decimal Fraccionario
1000 -0.5f -8 / 16
1001 -0.4375f -7 / 16
1010 -0.375f -6 / 16
1011 -0.3125f -5 / 16
1100 -0.25f -4 / 16
1101 -0.1875f -3 / 16
1110 -0.125f -2 / 16
1111 -0.0625f -1 /16
0000 0.0f 0 / 16
0001 -0.0625f 1 / 16
0010 -0.125f 2 / 16
0011 -0.1875f 3 / 16
0100 -0.25f 4 / 16
0101 -0.3125f 5 / 16
0110 -0.375f 6 / 16
0111 -0.4375f 7 / 16

Para los valores de cinco bits.

Valor binario Decimal Fraccionario
10000 -1 -16 / 16
10001 -0.9375 -15 / 16
10010 -0.875 -14 / 16
10011 -0.8125 -13 / 16
10100 -0.75 -12 / 16
10101 -0.6875 -11 / 16
10110 -0.625 -10 / 16
10111 -0.5625 -9 / 16
11000 -0.5 -8 / 16
11001 -0.4375 -7 / 16
11010 -0.375 -6 / 16
11011 -0.3125 -5 / 16
11100 -0.25 -4 / 16
11101 -0.1875 -3 / 16
11110 -0.125 -2 / 16
11111 -0.0625 -1 / 16
00000 0 0 / 16
00001 0.0625 1 / 16
00010 0.125 2 / 16
00011 0.1875 3 / 16
00100 0.25 4 / 16
00101 0.3125 5 / 16
00110 0.375 6 / 16
00111 0.4375 7 / 16
01000 0.5 8 / 16
01001 0.5625 9 / 16
01010 0.625 10 / 16
01011 0.6875 11 / 16
01100 0.75 12 / 16
01101 0.8125 13 / 16
01110 0.875 14 / 16
01111 0.9375 15 / 16

Para los valores de seis bits.

Valor binario Decimal Fraccionario
100000 -2 -32 / 16
100001 -1.9375 -31 / 16
100010 -1.875 -30 / 16
100011 -1.8125 -29 / 16
100100 -1.75 -28 / 16
100101 -1.6875 -27 / 16
100110 -1.625 -26 / 16
100111 -1.5625 -25 / 16
101000 -1.5 -24 / 16
101001 -1.4375 -23 / 16
101010 -1.375 -22 / 16
101011 -1.3125 -21 / 16
101100 -1.25 -20 / 16
101101 -1.1875 -19 / 16
101110 -1.125 -18 / 16
101111 -1.0625 -17 / 16
110000 -1 -16 / 16
110001 -0.9375 -15 / 16
110010 -0.875 -14 / 16
110011 -0.8125 -13 / 16
110100 -0.75 -12 / 16
110101 -0.6875 -11 / 16
110110 -0.625 -10 / 16
110111 -0.5625 -9 / 16
111000 -0.5 -8 / 16
111001 -0.4375 -7 / 16
111010 -0.375 -6 / 16
111011 -0.3125 -5 / 16
111100 -0.25 -4 / 16
111101 -0.1875 -3 / 16
111110 -0.125 -2 / 16
111111 -0.0625 -1 / 16
000000 0 0 / 16
000001 0.0625 1 / 16
000010 0.125 2 / 16
000011 0.1875 3 / 16
000100 0.25 4 / 16
000101 0.3125 5 / 16
000110 0.375 6 / 16
000111 0.4375 7 / 16
001000 0.5 8 / 16
001001 0.5625 9 / 16
001010 0.625 10 / 16
001011 0.6875 11 / 16
001100 0.75 12 / 16
001101 0.8125 13 / 16
001110 0.875 14 / 16
001111 0.9375 15 / 16
010000 1 16 / 16
010001 1.0625 17 / 16
010010 1.125 18 / 16
010011 1.1875 19 / 16
010100 1.25 20 / 16
010101 1.3125 21 / 16
010110 1.375 22 / 16
010111 1.4375 23 / 16
011000 1.5 24 / 16
011001 1.5625 25 / 16
011010 1.625 26 / 16
011011 1.6875 27 / 16
011100 1.75 28 / 16
011101 1.8125 29 / 16
011110 1.875 30 / 16
011111 1.9375 31 / 16

De la misma manera que con píxeles finos, EvaluateAttributeSnappedcuadrícula de ubicaciones evalúables se centra en el centro de píxeles grueso al usar sombreado de píxeles gruesos.

SetSamplePositions

Cuando la API ID3D12GraphicsCommandList1::SetSamplePositions se usa con sombreado grueso, la API establece las posiciones de ejemplo para píxeles finos.

SV_Coverage

Si SV_Coverage se declara como entrada o salida del sombreador en el nivel 1, se deshabilita el sombreado de píxeles general.

Puede usar la semántica de SV_Coverage con sombreado de píxeles gruesos en el nivel 2 y refleja qué muestras de un destino de MSAA se están escribiendo.

Cuando se usa sombreado de píxeles gruesos, lo que permite que varios píxeles de origen integren un icono, la máscara de cobertura representa todas las muestras que proceden de ese icono.

Dada la compatibilidad del sombreado de píxeles gruesos con MSAA, el número de bits de cobertura necesarios para especificarse puede variar. Por ejemplo, con un recurso 4x MSAA mediante D3D12_SHADING_RATE_2x2, cada píxel general escribe en cuatro píxeles finos y cada píxel fino tiene cuatro muestras. Esto significa que cada píxel general escribe en un total de 4 * 4 = 16 muestras.

Número de bits de cobertura necesarios

En la tabla siguiente se indica cuántos bits de cobertura se necesitan para cada combinación de tamaño de píxel general y nivel de MSAA.

Tabla muestra el tamaño de píxeles gruesos, el número de píxeles finos y los niveles de M S A A.

Como se indica en la tabla, no es posible usar píxeles generales para escribir en más de 16 ejemplos a la vez mediante la característica de sombreado de frecuencia variable expuesta a través de Direct3D 12. Esta restricción se debe a las restricciones de Direct3D 12 con respecto a qué niveles de MSAA se permiten con qué tamaño de píxel general (consulte la tabla en la Con sombreado de velocidad variable (VRS) sección de este tema).

Ordenación y formato de bits en la máscara de cobertura

Los bits de la máscara de cobertura se adhieren a un orden bien definido. La máscara consta de coberturas de píxeles de izquierda a derecha y, después, de arriba a abajo (columna principal). Los bits de cobertura son los bits de orden bajo de la semántica de cobertura y se empaquetan de forma densa.

En la tabla siguiente se muestra el formato de máscara de cobertura para combinaciones admitidas de tamaño de píxel general y nivel de MSAA.

Tabla muestra el tamaño de píxel general, el diagrama de píxeles gruesos y 1 x M S A bits de cobertura A. cobertura de

En la tabla siguiente se muestran 2 píxeles MSAA, donde cada píxel tiene dos muestras de índices 0 y 1.

El posicionamiento de las etiquetas de las muestras en los píxeles es ilustrativo y no transmite necesariamente las ubicaciones espaciales {X, Y} de las muestras en ese píxel; especialmente dado que las posiciones de ejemplo se pueden cambiar mediante programación. El índice basado en 0 hace referencia a los ejemplos.

Tabla muestra el tamaño de píxel general, el diagrama de píxeles gruesos y 2 x M S A bits de cobertura A. cobertura de

En la tabla siguiente se muestran 4 píxeles MSAA, donde cada píxel tiene cuatro muestras de índices 0, 1, 2 y 3.

Tabla muestra el tamaño de píxel general, el diagrama de píxeles gruesos y 4 x M S A bits de cobertura A. cobertura de

Descartar

Cuando se usa el discard semántico de HLSL con sombreado de píxeles gruesos, se descartan los píxeles gruesos.

Rasterización independiente del destino (TIR)

TIR no se admite cuando se usa sombreado de píxeles gruesos.

Vistas de orden de ráster (ROV)

Los interbloqueos de ROV se especifican como operativos en granularidad de píxeles finas. Si se realiza el sombreado por ejemplo, los interbloqueos funcionan con granularidad de ejemplo.

Rasterización conservadora

Puede usar la rasterización conservadora con sombreado de velocidad variable. Cuando se usa rasterización conservadora con sombreado de píxeles gruesos, los píxeles finos dentro de píxeles gruesos se rasterizan de forma conservadora mediante la cobertura completa.

Cobertura

Cuando se usa la rasterización conservadora, la semántica de cobertura contiene máscaras completas para píxeles finos cubiertos y 0 para píxeles finos que no están cubiertos.

Paquetes

Puede llamar a las API de sombreado de velocidad variable en una agrupación.

Pases de representación

Puede llamar a las API de sombreado de velocidad variable en un paso de representación.

Llamada a las API de VRS

En esta sección siguiente se describe la manera en que el sombreado de velocidad variable es accesible para la aplicación a través de Direct3D 12.

Consulta de funcionalidad

Para consultar la funcionalidad de sombreado de velocidad variable del adaptador, llame a ID3D12Device::CheckFeatureSupport con D3D12_FEATURE::D 3D12_FEATURE_D3D12_OPTIONS6y proporcione una estructura de D3D12_FEATURE_DATA_D3D12_OPTIONS6 para que la función se rellene automáticamente. La estructura D3D12_FEATURE_DATA_D3D12_OPTIONS6 contiene varios miembros, incluido uno del tipo enumerado D3D12_VARIABLE_SHADING_RATE_TIER (D3D12_FEATURE_DATA_D3D12_OPTIONS6::VariableShadingRateTier) y otro que indica si se admite el procesamiento en segundo plano (D3D12_FEATURE_DATA_D3D12_OPTIONS6::BackgroundProcessingSupported).

Para consultar la funcionalidad de nivel 1, por ejemplo, puede hacerlo.

D3D12_FEATURE_DATA_D3D12_OPTIONS6 options;
return 
    SUCCEEDED(m_device->CheckFeatureSupport(
        D3D12_FEATURE_D3D12_OPTIONS6, 
        &options, 
        sizeof(options))) && 
    options.ShadingRateTier == D3D12_VARIABLE_SHADING_RATE_TIER_1;

Tasas de sombreado

Los valores de la enumeración D3D12_SHADING_RATE se organizan para que las velocidades de sombreado se descomponen fácilmente en dos ejes, donde los valores de cada eje se representan de forma compacta en el espacio logarítmico según la enumeración D3D12_AXIS_SHADING_RATE.

Puede crear una macro para componer dos velocidades de sombreado de eje en una velocidad de sombreado como esta.

#define D3D12_MAKE_COARSE_SHADING_RATE(x,y) ((x) << 2 | (y))
D3D12_MAKE_COARSE_SHADING_RATE(
    D3D12_AXIS_SHADING_RATE_2X, 
    D3D12_AXIS_SHADING_RATE_1X)

La plataforma también proporciona estas macros, definidas en d3d12.h.

#define D3D12_GET_COARSE_SHADING_RATE_X_AXIS(x) ((x) >> 2 )
#define D3D12_GET_COARSE_SHADING_RATE_Y_AXIS(y) ((y) & 3 )

Se pueden usar para diseccionar y comprender SV_ShaderRate.

Nota

Esta interpretación de datos está orientada a describir la imagen del espacio de pantalla, que los sombreadores pueden manipular. Esto se describe más adelante en las secciones anteriores. Pero no hay ninguna razón para no tener una definición coherente de los tamaños de píxeles generales que se usarán en todas partes, incluido al establecer la velocidad de sombreado de nivel de comando.

Establecimiento de la velocidad de sombreado y los combinadores de nivel de comando

La velocidad de sombreado y, opcionalmente, los combinadores se especifican a través del método ID3D12GraphicsCommandList5::RSSetShadingRate. Se pasa un valor de D3D12_SHADING_RATE para la velocidad de sombreado base y una matriz opcional de valores de D3D12_SHADING_RATE_COMBINER.

Preparación de la imagen de espacio en pantalla

El estado de recurso de solo lectura que designa una imagen de velocidad de sombreado utilizable se define como D3D12_RESOURCE_STATES::D 3D12_RESOURCE_STATE_SHADING_RATE_SOURCE.

Establecimiento de la imagen de espacio de pantalla

Especifique la imagen de espacio de pantalla a través del método ID3D12GraphicsCommandList5::RSSetShadingRateImage.

m_commandList->RSSetShadingRateImage(screenSpaceImage);

Consulta del tamaño del icono

Puede consultar el tamaño del icono desde el miembro D3D12_FEATURE_DATA_D3D12_OPTIONS6::ShadingRateImageTileSize. Consulte funcionalidad consultando anteriores.

Se recupera una dimensión, ya que las dimensiones horizontales y verticales siempre son las mismas. Si la funcionalidad del sistema es D3D12_SHADING_RATE_TIER_NOT_SUPPORTED, el tamaño del icono devuelto es 0.