Modelo de sombreador 3 (referencia de HLSL)
Los sombreadores de vértices y los sombreadores de píxeles se simplifican considerablemente de las versiones anteriores del sombreador. Si va a implementar sombreadores en hardware, es posible que no use vs_3_0 o ps_3_0 con otras versiones del sombreador y no pueda usar ninguno de los tipos de sombreador con la canalización de funciones fijas. Estos cambios permiten simplificar los controladores y el entorno de ejecución. La única excepción es que los sombreadores de vs_3_0 solo software se pueden usar con cualquier versión del sombreador de píxeles. Además, si usa un sombreador de solo software vs_3_0 con una versión anterior del sombreador de píxeles, el sombreador de vértices solo puede usar la semántica de salida compatible con códigos de formato de vértice flexible (FVF).
La semántica usada en las salidas del sombreador de vértices debe usarse en entradas del sombreador de píxeles. La semántica se usa para asignar las salidas del sombreador de vértices a las entradas del sombreador de píxeles, de forma similar a la forma en que la declaración de vértices se asigna a los registros de entrada del sombreador de vértices y a los modelos de sombreador anteriores. Consulte Match Semantics on vs 3.0 and ps 3.0 Shaders (Coincidencia semántica en vs 3.0 y ps 3.0 Sombreadores).
Se han agregado estados de representación de modo de ajuste adicionales para cubrir la posibilidad de coordenadas de textura adicionales en este nuevo esquema. Los atributos con D3DDECLUSAGE_TEXCOORD y el índice de uso de 0 a 15 se interpolan en modo de ajuste cuando se establece el D3DRS_WRAP* correspondiente.
- Características del sombreador de vértices Modelo 3
- Características del modelo 3 del sombreador de píxeles
- Coincidencia de semántica en vs_3_0 y sombreadores de ps_3_0
- Cambios en el modo de niebla, profundidad y sombreado
- Conversiones de punto flotante e entero
- Especificar precisión completa o parcial
- Sombreadores de vértices de software y píxeles
Características del sombreador de vértices Modelo 3
Los tipos de registro de salida del sombreador de vértices se han contraído en doce registros (consulte Registros de salida). Cada registro que se usa debe declararse mediante la instrucción dcl y una semántica (por ejemplo, dcl_color0 o0.xyzw).
El modelo de sombreador de vértices 3_0 (vs_3_0) se expande en las características de vs_2_0 con una indexación de registros de registro más eficaz, un conjunto de registros de salida simplificados, la capacidad de muestrear una textura en un sombreador de vértices y la capacidad de controlar la velocidad a la que se inicializan las entradas del sombreador.
Indexar cualquier registro
Todos los registros( Registro de entrada y Registros de salida) se pueden indexar mediante el registro de contador de bucles (solo se pueden indexar registros constantes en versiones anteriores).
Debe declarar los registros de entrada y salida antes de indexarlos. Sin embargo, es posible que no indexe ningún registro de salida que se haya declarado con una semántica de tamaño de posición o punto. De hecho, si la indexación se usa la posición y la semántica psize deben declararse en los registros de o0 y o1, respectivamente.
Solo se le permite indexar un intervalo continuo de registros; es decir, no se puede indexar entre los registros que no se han declarado. Aunque esta restricción puede ser inconveniente, permite que se realice la optimización del hardware. Si se intenta indexar en registros no contiguos, se producirán resultados no definidos. La validación del sombreador no aplica esta restricción.
Simplificar los registros de salida
Todos los distintos tipos de registros de salida se han contraído en doce registros de salida: 1 para posición, 2 para color, 8 para textura y 1 para niebla o tamaño de punto. Estos registros interpolarán los datos que contengan para el sombreador de píxeles. Las declaraciones de registro de salida son necesarias y semántica se asignan a cada registro.
Los registros se pueden desglosar de la siguiente manera:
- Al menos un registro debe declararse como registro de posición de cuatro componentes. Este es el único registro del sombreador de vértices que es necesario.
- Los diez primeros registros consumidos por un sombreador pueden usar hasta cuatro componentes (xyzw) como máximo.
- El último registro (o duodécimo) solo puede contener un escalar (como el tamaño de punto).
Para obtener una lista de los registros, consulte Registers - vs_3_0.
Ejemplo de textura en un sombreador de vértices
El sombreador de vértices 3_0 admite la búsqueda de texturas en el sombreador de vértices mediante texldl: frente a
Características del modelo 3 del sombreador de píxeles
Los registros de textura y color del sombreador de píxeles se han contraído en diez registros de entrada (consulte Tipos de registro de entrada). Face Register es un registro escalar de punto flotante. Solo el signo de este registro es válido. Si el signo es negativo, el primitivo es una cara posterior. Esto se puede usar dentro de un sombreador de píxeles para lograr iluminación en dos lados, por ejemplo. El Registro de posición hace referencia a los píxeles actuales (x,y).
Los registros de constantes de sombreador se pueden establecer mediante:
Coincidencia de semántica en vs_3_0 y sombreadores de ps_3_0
Hay algunas restricciones en el uso semántico con vs_3_0 y ps_3_0. En general, debe tener cuidado al usar una semántica para una entrada de sombreador que coincida con una semántica usada en una salida del sombreador.
Por ejemplo, este sombreador de píxeles empaqueta varios nombres en un registro:
ps_3_0
dcl_texcoord0 v0.x
dcl_texcoord1 v0.yz // Valid to pack multiple names into one register
dcl_texcoord2_centroid v1.w
...
Cada registro tiene una semántica diferente. Observe que también puede asignar un nombre a v0.x y v0.yz con una semántica diferente (múltiple) debido al uso de la máscara de escritura.
Dado el sombreador de píxeles, no se puede emparejar el sombreador de vs_3_0 siguiente:
vs_3_0
...
dcl_texcoord0 o5.x
dcl_texcoord1 o6.yzw
...
Estos dos sombreadores entran en conflicto con el uso de la D3DDECLUSAGE_TEXCOORD0 y D3DDECLUSAGE_TEXCOORD1 semántica.
Vuelva a escribir el sombreador de vértices como este para evitar la colisión semántica:
vs_3_0
...
dcl_texcoord2 o3
dcl_texcoord3 o9
...
De forma similar, no se puede usar un nombre semántico declarado en distintos registros de entrada en el sombreador de píxeles (v0 y v1 en el sombreador de píxeles) en un único registro de salida en este sombreador de vértices. Por ejemplo, este sombreador de vértices no se puede emparejar con el sombreador de píxeles porque D3DDECLUSAGE_TEXCOORD1 se usa para los registros de entrada del sombreador de píxeles (v0, v1) y el registro de salida del sombreador de vértices o3.
vs_3_0
...
dcl_texcoord0 o3.x
dcl_texcoord1 o3.yz
dcl_texcoord2 o3.w // BAD! Would be valid if this were not o3
dcl_texcoord3 o9 ...
Por otro lado, este sombreador de vértices no se puede emparejar con el sombreador de píxeles porque la máscara de salida de un parámetro con una semántica determinada no proporciona los datos solicitados por el sombreador de píxeles:
vs_3_0
...
dcl_texcoord0 o5.x
dcl_texcoord1 o5.yzw
dcl_texcoord2 o7.yz // BAD! Would be valid if w were included
dcl_texcoord3 o9
...
Este sombreador de vértices no proporciona una salida con uno de los nombres semánticos solicitados por el sombreador de píxeles, por lo que el emparejamiento del sombreador no es válido:
vs_3_0
...
dcl_texcoord0 o5.x
dcl_texcoord1 o5.yzw
dcl_texcoord3 o9
// The pixel shader wants texcoord2, with a w component,
// but it isn't output by this vertex shader at all!
...
Cambios en el modo de niebla, profundidad y sombreado
Cuando D3DRS_SHADEMODE se establece para sombreado plano durante el recorte y la rasterización de triángulos, los atributos con D3DDECLUSAGE_COLOR se interpolan como sombreados planos. Si se declara algún componente de un registro con una semántica de color, pero otros componentes del mismo registro tienen una semántica diferente, la interpolación de sombreado plano (lineal frente a plana) no estará definida en los componentes de ese registro sin una semántica de color.
Si se desea representar la niebla, vs_3_0 y ps_3_0 sombreadores deben implementar niebla. No se realizan cálculos de niebla fuera de los sombreadores. No hay registro de niebla en vs_3_0 y semántica adicional D3DDECLUSAGE_FOG (para factor de fusión de niebla calculado por vértice) y D3DDECLUSAGE_DEPTH (para pasar un valor de profundidad al sombreador de píxeles para calcular el factor de mezcla de niebla) se han agregado.
El estado de la fase de textura D3DTSS_TEXCOORDINDEX se omite al usar el sombreador de píxeles 3.0.
Se han agregado los siguientes valores para dar cabida a estos cambios:
// Fog and Depth usages
D3DDECLUSAGE_FOG
D3DDECLUSAGE_DEPTH
// Additional wrap states for vs_3_0 attributes with D3DDECLUSAGE_TEXCOORD
D3DRS_WRAP8
D3DRS_WRAP9
D3DRS_WRAP10
D3DRS_WRAP11
D3DRS_WRAP12
D3DRS_WRAP13
D3DRS_WRAP14
D3DRS_WRAP15
Conversiones de punto flotante e entero
Las matemáticas de punto flotante se producen en diferentes intervalos y precisión (16 bits, 24 bits y 32 bits) en diferentes partes de la canalización. Un valor mayor que el intervalo dinámico de la canalización que entra en esa canalización (por ejemplo, un mapa de textura float de 32 bits se muestrea en una canalización float de 24 bits en ps_2_0) crea un resultado indefinido. Para un comportamiento predecible, debe sujetar este valor al máximo del intervalo dinámico.
La conversión de un valor de punto flotante a un entero se produce en varios lugares como:
- Al encontrar un mova - vs instrucción.
- Durante el direccionamiento de textura.
- Al escribir en un destino de representación de punto no flotante.
Especificar precisión completa o parcial
Tanto ps_3_0 como ps_2_x proporcionan compatibilidad con dos niveles de precisión:
ps_3_0 | ps_2_0 | Precision | Value |
---|---|---|---|
x | Completo | fp32 o superior | |
x | Precisión parcial | fp16=s10e5 | |
x | x | Completo | fp24=s16e7 o superior |
x | x | Precisión parcial | fp16=s10e5 |
ps_3_0 admite más precisión que ps_2_0. De forma predeterminada, todas las operaciones se producen en el nivel de precisión completa.
Se solicita precisión parcial (vea Modificadores de registro del sombreador de píxeles) agregando el modificador _pp al código del sombreador (siempre que la implementación subyacente lo admita). Las implementaciones siempre son libres de omitir el modificador y realizar las operaciones afectadas con precisión completa.
El modificador _pp puede producirse en dos contextos:
- En una declaración de coordenadas de textura para pasar coordenadas de textura de precisión parcial al sombreador de píxeles. Esto puede usarse cuando las coordenadas de textura retransmiten datos de color al sombreador de píxeles, lo que puede ser más rápido con precisión parcial que con precisión completa en algunas implementaciones.
- En cualquier instrucción para solicitar el uso de precisión parcial, incluidas las instrucciones de carga de textura. Esto indica que la implementación puede ejecutar la instrucción con precisión parcial y almacenar un resultado de precisión parcial. En ausencia de un modificador explícito, la instrucción debe realizarse con precisión completa (independientemente de la precisión de los operandos de entrada).
Una aplicación puede optar deliberadamente por desactivar la precisión del rendimiento. Hay varios tipos de datos de entrada del sombreador que son candidatos naturales para el procesamiento de precisión parcial:
- Los iteradores de color están bien representados por valores de precisión parcial.
- Los valores de textura de la mayoría de los formatos se pueden representar con precisión mediante valores de precisión parcial (los valores muestreados de texturas de formato de punto flotante de 32 bits son una excepción obvia).
- Las constantes se pueden representar mediante una representación de precisión parcial según corresponda al sombreador.
En todos estos casos, el desarrollador puede optar por especificar una precisión parcial para procesar los datos, sabiendo que no se pierde ninguna precisión de datos de entrada. En algunos casos, un sombreador puede requerir que los pasos internos de un cálculo se realicen con precisión completa incluso cuando los valores de entrada y salida final no tienen más de precisión parcial.
Sombreadores de vértices de software y píxeles
Las implementaciones de software (en tiempo de ejecución y referencia para sombreadores de vértices y referencia para sombreadores de píxeles) de la versión 2_0 y versiones posteriores tienen cierta validación relajada. Esto es útil para la depuración y creación de prototipos. La aplicación indica al ensamblador o en tiempo de ejecución que necesita parte de la validación relajada mediante la marca _sw en el ensamblador (por ejemplo, vs_2_sw). Un sombreador de software no funcionará con hardware.
vs_2_sw es una relajación a los límites máximos de vs_2_x; del mismo modo, ps_2_sw es una relajación a los límites máximos de ps_2_x. En concreto, las siguientes validaciones se relajan:
Modelo de sombreador | Recurso | Límite |
---|---|---|
vs_2_sw, vs_3_sw, ps_2_sw, ps_3_sw | Recuentos de instrucciones | Sin límite |
vs_2_sw, vs_3_sw, ps_2_sw, ps_3_sw | Registros de constantes float | 8192 |
vs_2_sw, vs_3_sw, ps_2_sw, ps_3_sw | Registros de constantes enteros | 2048 |
vs_2_sw, vs_3_sw, ps_2_sw, ps_3_sw | Registros de constantes booleanas | 2048 |
ps_2_sw | Profundidad de lectura dependiente | Sin límite |
vs_2_sw | instrucciones y etiquetas de control de flujo | Sin límite |
vs_2_sw, vs_3_sw, ps_2_sw, ps_3_sw | Inicio de bucle, pasos y recuentos | El tamaño del paso de iteración e inicio de iteración para las instrucciones de repetición y bucle son enteros con signo de 32 bits. El recuento puede ser de hasta MAX_INT/64. |
vs_2_sw, vs_3_sw, ps_2_sw, ps_3_sw | Límites de puertos | Los límites de puerto para todos los archivos de registro están relajados. |
vs_3_sw | Número de interpoladores | 16 registros de salida en vs_3_sw. |
ps_3_sw | Número de interpoladores | 14(16-2) registros de entrada para ps_3_sw. |
Temas relacionados