Sombreado de velocidad variable (VRS)
La motivación para 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 tasa de sombreado se puede reducir con poca o ninguna reducción en la calidad de salida perceptible; lo que conduce a una mejora del rendimiento que básicamente es gratuita.
Sin VRS: suavizado de contorno multimuestreo con supermuestreo
Sin sombreado de velocidad variable, el único medio de controlar la velocidad de sombreado es con suavizado de contorno 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 si elige entre la ejecución basada en píxeles o el muestreo de MSAA con supermuestreo. Esas 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) extiende el supermuestreo con-MSAA al 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 difunde 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 gruesos. Puede variar el tamaño de píxel general después de haber asignado 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:
- En el caso de las celdas marcadas como Y, esa combinación está habilitada.
- En el caso de las celdas marcadas como Cap, esa combinación está habilitada condicionalmente en función de un extremo (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 de alineación de hardware adicionales para admitir, en comparación con los otros casos.
Niveles de características
Hay dos niveles para 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.
Nivel 1
- La tasa de sombreado solo se puede especificar por dibujo; no más pormenorizados que eso.
- La tasa 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 dibujo, 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 menos.
- Se garantiza que la tasa de sombreado solicitada por la aplicación se entregue exactamente (para la precisión de los filtros de reconstrucción temporal y otros).
- se admite SV_ShadingRate entrada de PS.
- La velocidad de sombreado por vértice (también conocida como por primitivo), es válida cuando se usa una ventanilla y
SV_ViewportArrayIndex
no se escribe en. - La velocidad de vértices por provocación se puede usar con más de una ventanilla si la funcionalidad SupportsPerVertexShadingRateWithMultipleViewports se establece
true
en . Además, en ese caso, esa tasa se puede usar cuandoSV_ViewportArrayIndex
se escribe en .
Lista de capacidades
-
AdditionalShadingRatesSupported
- Tipo booleano.
- Indica si se admiten tamaños de píxeles gruesos de 2x4, 4x2 y 4x4 para la representación de muestra única; y si el tamaño de píxel general 2x4 es compatible con 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 tasa 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 tasa de sombreado por dibujo.
Los valores de este estado se expresan a través de la enumeración D3D12_SHADING_RATE .
Compatibilidad con tamaño de píxeles generales
Las tasas 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 en 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 regiones de calidad variable, como áreas que se tratarán 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. En otras palabras, los datos de velocidad de sombreado se especifican con una granularidad de mosaicos de 8 x 8 o 16 x 16 píxeles, como se indica en el tamaño del icono VRS.
Tamaño de mosaico
La aplicación puede consultar una API para recuperar el tamaño de icono de VRS admitido para su dispositivo.
Los mosaicos son cuadrados y el tamaño hace referencia al ancho o alto del icono en elementos de textura.
Si el hardware no admite sombreado de velocidad variable de nivel 2, la consulta de funcionalidad para el tamaño del icono devuelve 0.
Si el 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}, con un tamaño de icono determinado denominado VRSTileSize, la imagen de espacio de pantalla que la 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, omite 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 inferior.
Si la imagen de espacio en 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 parte superior izquierda de la imagen de espacio de pantalla (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 grandes 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 crear una matriz ni se puede mimer. 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 DESCONOCIDO. No puede ser implícitamente un diseño principal de fila, porque no se permite el adaptador cruzado.
La manera esperada en la que se rellenan los datos de la imagen de espacio de pantalla es para cualquiera de los dos
- Escribir los datos mediante un sombreador de proceso; la imagen de espacio de pantalla está enlazada como un UAV o
- 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 un adaptador cruzado.
data
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 imagen de espacio de pantalla. Se define un estado de solo lectura, D3D12_RESOURCE_STATE_SHADING_RATE_SOURCE, para este fin.
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 null
imagen de espacio de pantalla 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 en 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 ninguna implicación especial con respecto a la promoción o descomposición.
Atributo por primitivo
Un atributo por primitivo agrega la capacidad de especificar un término de velocidad de sombreado como atributo de un vértice provocado. 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 que se puede establecer denominada SV_ShadingRate
.
SV_ShadingRate
existe como parte del 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 supone que un valor de velocidad de sombreado de 1x1 es la 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.
Cada par de A y B se combina mediante un combinador.
* Al especificar una velocidad de sombreador por atributo de vértice.
- Si se usa un sombreador de geometría, se puede especificar la velocidad de sombreado a través de eso.
- Si no se usa un sombreador de geometría, la velocidad de sombreado se especifica mediante el vértice provocador.
Lista de combinadores
Se admiten los siguientes combinadores. Usar un combinador (C) y dos entradas (A y B).
- Paso directo. C.xy = A.xy.
- Invalidación. C.xy = B.xy.
- Mayor calidad. C.xy = min(A.xy, B.xy).
- Menor calidad. C.xy = max(A.xy, B.xy).
- Aplique el costo B en relación con A. 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 a una velocidad de sombreado compatible.
Si la salida de un combinador no corresponde a una velocidad de sombreado admitida en la plataforma, el resultado se sanea a una velocidad de sombreado compatible.
Estado predeterminado y borrado de estado
Todos los orígenes 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 con el valor predeterminado de "ninguna 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 los datos
Los datos se interpretan como un valor de la enumeración D3D12_SHADING_RATE .
Si VRS no se usa
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 SV_SampleIndex
o mediante la palabra clave 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
SV_ShadingRate
variable 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 tasa de sombreado calculada como salida de los combinadores (consulte la sección Combinación de factores de frecuencia de sombreado en 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 la funcionalidad AdditionalShadingRatesSupported es true
, 2x4, 4x2 y 4x4 también se admiten tasas de sombreado para algunos recuentos de muestras (consulte la tabla en la sección Con sombreado de velocidad variable (VRS) de este tema).
Derivados del espacio en pantalla
Los cálculos de degradados de píxeles a píxeles adyacentes 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 del 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 detallados 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 ejemplo.
Center
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 generales.
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 tendrá en cuenta 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 del ejemplo es AND-ed 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 ejemplo
La ejecución basada en muestras o el supermuestreo (que se debe al uso de la característica de interpolación de muestras) 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.
El intrínseco EvaluateAttributeSnapped
se puede usar 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 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 16 x 16 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, EvaluateAttributeSnapped
el parámetro offset es capaz de especificar una gama más amplia de ubicaciones. El parámetro offset selecciona una cuadrícula de 16 x 16 para cada píxel fino y hay varios píxeles finos. El intervalo expresable 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 no.
En la tabla siguiente se describe la interpretación del EvaluateAttributeSnapped
parámetro offset de cada tamaño de píxel general.
Intervalo de desplazamiento de EvaluateAttributeSnapped
Tamaño de píxel general | Rango 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, 00000000000xxxxx} |
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, 000000000xxxxxx} |
4x2 | {[-32, 31], [-16, 15]} | {64, 32} | {6, 5} | {000000000xxxxxx, 00000000000xxxxx} |
4 x 4 | {[-32, 31], [-32, 31]} | {64, 64} | {6, 6} | {000000000xxxxxx, 000000000xxxxxx} |
Las tablas siguientes son una guía para la conversión desde el punto fijo a la representación decimal y fraccionararia. 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 de 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 | Fracciones |
---|---|---|
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 | Fracciones |
---|---|---|
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 valores de seis bits.
Valor binario | Decimal | Fracciones |
---|---|---|
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, EvaluateAttributeSnapped
la cuadrícula de ubicaciones que se pueden evaluar se centra en el centro de píxeles gruesos al usar sombreado de píxeles gruesos.
SetSamplePositions
Cuando se usa la API ID3D12GraphicsCommandList1::SetSamplePositions 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 gruesos.
Puede usar la SV_Coverage
semántica 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 incluyan 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 de 4x MSAA mediante D3D12_SHADING_RATE_2x2, cada píxel grueso 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.
Como se indica en la tabla, no es posible usar píxeles gruesos para escribir en más de 16 muestras a la vez mediante la característica de sombreado de velocidad 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 sección Con sombreado de velocidad variable (VRS) 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 densamente.
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.
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 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. Su índice basado en 0 hace referencia a los ejemplos.
En la tabla siguiente se muestran 4 píxeles MSAA, donde cada píxel tiene cuatro muestras de índices 0, 1, 2 y 3.
Discard (Descartar)
Cuando se usa la semántica discard
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 trama (ROV)
Los interbloqueos 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 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 que están cubiertos y 0 para píxeles finos que no están cubiertos.
Agrupaciones
Puede llamar a las API de sombreado de velocidad variable en una agrupación.
Fases de representación
Puede llamar a las API de sombreado de velocidad variable en un pase de representación.
Llamar 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 funcionalidades
Para consultar la funcionalidad de sombreado de velocidad variable del adaptador, llame a ID3D12Device::CheckFeatureSupport con D3D12_FEATURE::D 3D12_FEATURE_D3D12_OPTIONS6 y 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 que es 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 descompongan fácilmente en dos ejes, donde los valores de cada eje se representan compactamente 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 de 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 gruesos que se usarán en todas partes, incluido al establecer la velocidad de sombreado de nivel de comando.
Establecimiento de la velocidad de sombreado en el nivel de comando y los combinadores
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 de 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 La consulta de funcionalidad anterior.
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.