Semántica

Una semántica es una cadena adjunta a una entrada o salida del sombreador que transmite información sobre el uso previsto de un parámetro. La semántica es necesaria en todas las variables que se pasan entre las fases del sombreador. La sintaxis para agregar una semántica a una variable de sombreador se muestra aquí (Sintaxis de variable (DirectX HLSL)).

En general, los datos pasados entre fases de canalización son completamente genéricos y el sistema no los interpreta de forma única; se permite la semántica arbitraria que no tiene ningún significado especial. Los parámetros (en Direct3D 10 y versiones posteriores) que contienen estas semánticas especiales se conocen como semántica de valor del sistema.

Semántica compatible con Direct3D 9, Direct3D 10 y versiones posteriores

Los siguientes tipos de semántica se admiten en Direct3D 9, Direct3D 10 y versiones posteriores.

Semántica del sombreador de vértices

Esta semántica tiene significado cuando se adjunta a un parámetro de sombreador de vértices. Estas semánticas son compatibles con Direct3D 9, Direct3D 10 y versiones posteriores.

Entrada Descripción Tipo
BINORMAL[n] Binormal float4
BLENDINDICES[n] Índices de mezcla uint
BLENDWEIGHT[n] Ponderaciones de mezcla flotante
COLOR[n] Color difuso y especular float4
NORMAL[n] Vector normal float4
POSITION[n] Posición del vértice en el espacio de objetos. float4
POSITIONT Posición de vértice transformada. float4
PSIZE[n] Tamaño de punto flotante
TANGENT[n] Tangente float4
TEXCOORD[n] Coordenadas de textura float4
Output Descripción Tipo
COLOR[n] Color difuso o especular float4
FOG Niebla en vértices flotante
POSITION[n] Posición de un vértice en un espacio homogéneo. Posición de proceso en el espacio de pantalla dividiendo (x,y,z) por w. Cada sombreador de vértices debe escribir un parámetro con esta semántica. NOTA: Esta semántica está disponible en Direct3D 9. Para Direct3D 10 y versiones posteriores, use SV_Position en su lugar. float4
PSIZE Tamaño de punto flotante
TESSFACTOR[n] Factor de teselado flotante

n es un entero opcional entre 0 y el número de recursos admitidos. Por ejemplo, POSITION0, TEXCOORD1, etc.

Semántica del sombreador de píxeles

Esta semántica tiene significado cuando se adjunta a un parámetro de entrada del sombreador de píxeles. Estas semánticas son compatibles con Direct3D 9, Direct3D 10 y versiones posteriores.

Entrada Descripción Tipo
COLOR[n] Color difuso o especular. float4
TEXCOORD[n] Coordenadas de textura float4
VFACE Escalar de punto flotante que indica un primitivo orientado hacia atrás. Un valor negativo se orienta hacia atrás, mientras que un valor positivo se orienta a la cámara.

Nota:
Esta semántica está disponible en Direct3D 9 Modelo de sombreador 3.0. Para Direct3D 10 y versiones posteriores, use SV_IsFrontFace en su lugar.


flotante
VPOS Ubicación de píxeles (x,y) en el espacio de la pantalla. Para convertir un sombreador de Direct3D 9 (que usa esta semántica) a un sombreador de Direct3D 10 y versiones posteriores, vea VPOS de Direct3D 9 y SV_Position de Direct3D 10). float2
Output Descripción Tipo
COLOR[n] Color de salida float4
DEPTH[n] Profundidad de salida flotante

n es un entero opcional entre 0 y el número de recursos admitidos. Por ejemplo, PSIZE0, COLOR1, etc.

La semántica COLOR solo es válida en el modo de compatibilidad del sombreador (es decir, cuando se crea el sombreador mediante D3D10_SHADER_ENABLE_BACKWARDS_COMPATIBILITY).

Semántica solo compatible con Direct3D 10 y versiones posteriores.

Los siguientes tipos de semántica se han introducido recientemente para Direct3D 10 y no están disponibles para Direct3D 9.

Semántica de valores del sistema

La semántica de valores del sistema es nueva en Direct3D 10. Todos los valores del sistema comienzan con un prefijo de SV_, un ejemplo común es SV_POSITION, que se interpreta mediante la fase de rasterizador. Los valores del sistema son válidos en otras partes de la canalización. Por ejemplo, SV_Position se pueden especificar como entrada para un sombreador de vértices, y también como una salida. Los sombreadores de píxeles solo pueden escribir en parámetros con la semántica de valores del sistema SV_Depth y SV_Target.

Otros valores del sistema (SV_VertexID, SV_InstanceID y SV_IsFrontFace) solo pueden introducirse en el primer sombreador activo de la canalización que puede interpretar el valor determinado; después de eso, la función de sombreador debe pasar los valores a las fases posteriores.

SV_PrimitiveID es una excepción a esta regla que indica que solo se introduce en el primer sombreador activo de la canalización que puede interpretar el valor determinado; el hardware puede proporcionar el mismo valor de id. que la entrada a la fase del sombreador de casco, la fase de sombreador de dominio, y después de esa, sea cual sea la fase, es la primera habilitada: fase del sombreador de geometría o fase del sombreador de píxeles.

Si el teselado está habilitado, la fase del sombreador de casco y la fase de sombreador de dominio están presentes. Para una revisión determinada, el mismo PrimitiveID se aplica a la invocación del sombreador de casco de la revisión y a todas las invocaciones del sombreador de dominio teselado. El mismo PrimitiveID también se propaga a la siguiente fase activa; fase del sombreador de geometría o fase de sombreador de píxeles si está habilitada.

Si el sombreador de geometría establece como entrada SV_PrimitiveID, y debido a que pueden generar cero, uno o varios primitivos por invocación, el sombreador debe programar su propia elección de SV_PrimitiveID valor para cada primitivo de salida si un sombreador de píxeles posterior establece como entrada SV_PrimtiveID.

A modo de otro ejemplo, la fase del sombreador de vértices no puede interpretar SV_PrimitiveID porque un vértice puede ser miembro de varios primitivos.

Estas semánticas se han agregado a Direct3D 10; no están disponibles en Direct3D 9.

Semántica de valores del sistema para la fase de rasterizador.

Semántica de valores del sistema Descripción Tipo
SV_ClipDistance[n] Recorte de datos de distancia. Se supone que los valores de SV_ClipDistance son una distancia con signo float32 a un plano. La configuración primitiva solo invoca la rasterización en píxeles para los que las distancias del plano interpolado son >= 0. Se pueden implementar varios planos de recorte simultáneamente, declarando varios componentes de uno o varios elementos de vértices como el SV_ClipDistance. Los valores de distancia de recorte y selección combinados son como máximo D3D#_CLIP_OR_CULL_DISTANCE_COUNT componentes en un máximo de D3D#_CLIP_OR_CULL_DISTANCE_ELEMENT_COUNT registros. Disponible para todos los sombreadores en los que se va a leer o escribir, excepto el sombreador de vértices, que puede escribir el valor, pero no tomarlo como entrada.
El atributo clipplanes funciona como SV_ClipDistance, pero en todos los niveles de características de hardware 9_x y versiones posteriores. Para obtener más información, vea Planos de clip de usuario en hardware de nivel de característica 9.
flotante
SV_CullDistance[n] Datos de distancia de selección. Cuando a los componentes de los elementos de vértice se les asigna esta etiqueta, se supone que estos valores son una distancia con signo float32 a un plano. Los primitivos se descartarán completamente si las distancias del plano para todos los vértices del primitivo son < 0. Se pueden implementar varios planos de selección simultáneamente, declarando varios componentes de uno o varios elementos de vértices como el SV_CullDistance. Los valores de distancia de recorte y selección combinados son como máximo D3D#_CLIP_OR_CULL_DISTANCE_COUNT componentes en un máximo de D3D#_CLIP_OR_CULL_DISTANCE_ELEMENT_COUNT registros. Disponible para todos los sombreadores en los que se va a leer o escribir, excepto el sombreador de vértices, que puede escribir el valor, pero no tomarlo como entrada.
flotante
SV_Coverage Una máscara que se puede especificar en la entrada, salida o en ambos sombreador de píxeles.
En el caso de SV_Coverage en un sombreador de píxeles, OUTPUT se admite en ps_4_1 o una versión superior.
En el caso de SV_Coverage en un sombreador de píxeles, INPUT requiere ps_5_0 o una versión superior.
uint
SV_Depth Datos de búfer de profundidad. El sombreador de píxeles puede escribir en él. flotante
SV_DepthGreaterEqual En un sombreador de píxeles, permite la salida de profundidad, siempre que sea mayor o igual que el valor que determina el rasterizador. Habilita el ajuste de profundidad sin deshabilitar la Z pronto. flotante
SV_DepthLessEqual En un sombreador de píxeles, permite la salida de profundidad, siempre que sea menor o igual que el valor que determina el rasterizador. Habilita el ajuste de profundidad sin deshabilitar la Z pronto. flotante
SV_DispatchThreadID Define el desplazamiento global del subproceso en la llamada Dispatch, por dimensión del grupo. Disponible como entrada para el sombreador de proceso. (solo lectura) uint3
SV_DomainLocation Define la ubicación en el casco del punto de dominio actual que se está evaluando. Disponible como entrada para el sombreador de dominio. (solo lectura) float2|3
SV_GroupID Define el desplazamiento de grupo en una llamada Dispatch, por dimensión de la llamada Dispatch. Disponible como entrada para el sombreador de proceso. (solo lectura) uint3
SV_GroupIndex Proporciona un índice aplanado para un subproceso determinado en un grupo determinado. Disponible como entrada para el sombreador de proceso. (solo lectura) uint
SV_GroupThreadID Define el desplazamiento del subproceso en el grupo, por dimensión del grupo. Disponible como entrada para el sombreador de proceso. (solo lectura) uint3
SV_GSInstanceID Define la instancia del sombreador de geometría. Disponible como entrada para el sombreador de geometría. La instancia que es necesaria como sombreador de geometría se puede invocar hasta 32 veces en el mismo primitivo de geometría. uint
SV_InnerCoverage Representa información de rasterización conservadora infravalorada (es decir, si un píxel está garantizado para estar completamente cubierto). Lo puede leer o escribir el sombreador de píxeles.
SV_InsideTessFactor Define la cantidad de teselado que hay en una superficie de revisión. Disponible en el sombreador de casco para escribir y en el sombreador de dominio para leer. float|float[2]
SV_InstanceID Identificador por instancia que genera automáticamente el runtime (vea Uso de valores generados por el sistema (Direct3D 10)). Disponible para todos los sombreadores.
SV_IsFrontFace Especifica si un triángulo está orientado hacia delante. Para líneas y puntos, IsFrontFace tiene el valor true. La excepción son las líneas trazadas a partir de triángulos (modo retícula), que establece IsFrontFace de la misma manera que rasterizar el triángulo en modo sólido. El sombreador de geometría puede escribir en él y el sombreador de píxeles lo puede leer. bool
SV_OutputControlPointID Define el índice del id. de punto de control que opera una invocación del punto de entrada principal del sombreador de casco. Solo lo puede leer el sombreador de casco. uint
SV_Position Cuando SV_Position se declara para la entrada en un sombreador, puede tener uno de los dos modos de interpolación especificados: linearNoPerspective o linearNoPerspectiveCentroid, donde este último hace que se proporcionen valores xyzw acoplados centroid cuando se habilita el suavizado de muestreo múltiple. Cuando se usa en un sombreador, SV_Position describe la ubicación del píxel. Disponible en todos los sombreadores para obtener el centro de píxeles con un desplazamiento de 0,5. float4
SV_PrimitiveID Identificador por primitivo que genera automáticamente el runtime (vea Uso de valores generados por el sistema (Direct3D 10)). Los sombreadores de píxeles pueden escribir en él y el sombreador de geometría, píxeles, casco o dominio lo pueden leer. uint
SV_RenderTargetArrayIndex Índice de matriz de destino de representación. Se aplica a la salida del sombreador de geometría e indica el segmento de matriz de destino de representación en el que el sombreador de píxeles dibujará el primitivo. SV_RenderTargetArrayIndex solo es válido si el destino de representación es un recurso de matriz. Esta semántica solo se aplica a primitivos; si un primitivo tiene más de un vértice, se usa el valor del vértice inicial. Este valor también indica qué segmento de matriz de una vista de profundidad/galería de símbolos se usa con fines de lectura y escritura.
Puede escribirse desde el sombreador de geometría y el sombreador de píxeles lo puede leer.
Si D3D11_FEATURE_DATA_D3D11_OPTIONS3::VPAndRTArrayIndexFromAnyShaderFeedingRasterizer es true, SV_RenderTargetArrayIndex se aplica a cualquier sombreador que alimente el rasterizador.
uint
SV_SampleIndex Datos de índice de frecuencia de muestreo. Disponible para que lo lea únicamente el sombreador de píxeles o escriba en él. uint
SV_StencilRef Representa el valor de referencia de la galería de símbolos del sombreador de píxeles actual. Solo el sombreador de píxeles puede escribir en él. uint
SV_Target[n], donde 0 <= n <= 7 Valor de salida que se almacenará en un destino de representación. El índice determina cuál de los 8 posibles destinos de representación enlazados se va a escribir. El valor está disponible para todos los sombreadores. float[2|3|4]
SV_TessFactor Define la cantidad de teselado en cada borde de una revisión. Disponible en el sombreador de casco para escribir y en el sombreador de dominio para leer. float[2|3|4]
SV_VertexID Identificador por vértice que genera automáticamente el runtime (vea Uso de valores generados por el sistema (Direct3D 10)). Disponible como entrada solo para el sombreador de vértices. uint
SV_ViewportArrayIndex Índice de matriz de ventanilla. Se aplica a la salida del sombreador de geometría e indica qué ventanilla se va a usar para el primitivo que se está escribiendo actualmente. El sombreador de píxeles puede leerlo. El primitivo se transformará y recortará en la ventanilla que especifica el índice antes de pasarlo al rasterizador. Esta semántica solo se aplica a primitivos; si un primitivo tiene más de un vértice, se usa el valor del vértice inicial.
Si D3D11_FEATURE_DATA_D3D11_OPTIONS3::VPAndRTArrayIndexFromAnyShaderFeedingRasterizer es true, SV_ViewportArrayIndex se aplica a cualquier sombreador que alimente el rasterizador.
uint
SV_ShadingRate Define, mediante valores de frecuencia de sombreado, el número de píxeles que escribe una invocación de sombreador de píxeles para dispositivos de frecuencia de sombreado variable de nivel 2 o superiores. Se puede leer desde el sombreador de píxeles. Se puede escribir desde un sombreador de vértices o geometría. uint

Limitaciones al escribir SV_Depth:

  • Cuando el muestreo múltiple (MultisampleEnable es TRUE en D3D10_RASTERIZER_DESC) y escribe un valor de profundidad (mediante un sombreador de píxeles), el valor único escrito también se usa en la prueba de profundidad; por lo tanto, la capacidad de representar bordes primitivos en una resolución superior se pierde cuando se habilita el muestreo múltiple.
  • Al usar el control de flujo dinámico, es imposible determinar en tiempo de compilación si se garantiza que un sombreador que escribe SV_Depth en algunas rutas de acceso escriba SV_Depth en cada ejecución. Error al escribir SV_Depth cuando se declara como resultado un comportamiento indefinido (que puede incluir o no descartar el píxel).
  • Cualquier valor float32 que incluya +/-INF y NaN se puede escribir en SV_Depth.
  • Escribir en SV_Depth sigue siendo válido al realizar la combinación de color de origen dual.

Migración de Direct3D 9 a Direct3D 10 y versiones posteriores

Se deben tener en cuenta los siguientes problemas al migrar código de Direct3D 9 a Direct3D 10 y versiones posteriores:

Asignación a la semántica de Direct3D 9

Algunas de las semánticas de Direct3D 10 y versiones posteriores se asignan directamente a la semántica de Direct3D 9.

Semántica de Direct3D 10 Semántica equivalente de Direct3D 9
SV_Depth DEPTH
SV_Position POSITION
SV_Target COLOR

[!] Nota para desarrolladores de Direct3D 9: para destinos de Direct3D 9, la semántica del sombreador debe asignarse a la semántica válida de Direct3D 9. Para la compatibilidad con versiones anteriores, FXC trata POSITION0 (y sus nombres de variante) como SV_Position. FXC trata COLOR como SV_TARGET. DXC y compiladores más recientes consideran POSITION[n] y COLOR como semántica definida por el usuario.

VPOS de Direct3D 9 y SV_Position de Direct3D 10

SV_Position semántica de D3D10 proporciona una función similar a la semántica VPOS del modelo 3 de sombreador de Direct3D 9. Por ejemplo, en Direct3D 9 se usa la sintaxis siguiente para un sombreador de píxeles mediante coordenadas de espacio de pantalla:

float4 psMainD3D9( float4 screenSpace : VPOS ) : COLOR
{
    // code here 
}

VPOS se agregó para la compatibilidad con el modelo 3 de sombreador a fin de especificar coordenadas de espacio de pantalla, ya que la semántica POSITION estaba pensada para coordenadas de espacio de objetos.

En Direct3D 10 y versiones posteriores, la semántica SV_Position (cuando se usa en el contexto de un sombreador de píxeles) especifica coordenadas de espacio de pantalla (desplazado en 0,5). Por lo tanto, el sombreador de Direct3D 9 sería aproximadamente equivalente (sin tener en cuenta el desplazamiento de 0,5) a lo siguiente:

float4 psMainD3D10( float4 screenSpace : SV_Position ) : COLOR
{
    // code here
}

Al migrar de Direct3D 9 a Direct3D 10 y versiones posteriores, deberá tener en cuenta esto al traducir los sombreadores.

Planos de recorte de usuario en HLSL

A partir de Windows 8, puede usar el atributo de función lipplanes en una declaración de función HLSL en lugar de SV_ClipDistance para que el sombreador funcione en el nivel de característica 9_x, así como en el nivel de característica 10 y versiones posteriores. Para obtener más información, vea Planos de clip de usuario en hardware de nivel de característica 9.