Common-Shader Core

En El modelo de sombreador 4, todas las fases del sombreador implementan la misma funcionalidad base mediante un núcleo de sombreador común. Además, cada una de las tres fases del sombreador (vértice, geometría y píxel) ofrece una funcionalidad única para cada fase, como la capacidad de generar nuevas primitivas a partir de la fase del sombreador de geometría o descartar un píxel específico en la fase del sombreador de píxeles. En el diagrama siguiente se muestra cómo fluyen los datos a través de una fase del sombreador y la relación del núcleo de sombreador común con los recursos de memoria del sombreador.

diagrama de flujo de datos en una fase de sombreador

  • Datos de entrada: un sombreador de vértices recibe sus entradas de la fase del ensamblador de entrada; Los sombreadores de geometría y píxel reciben sus entradas de la fase anterior del sombreador. Entre las entradas adicionales se incluye la semántica devalor del sistema, que se puede consumir mediante la primera unidad de la canalización a la que son aplicables.
  • Datos de salida: los sombreadores generan resultados de salida que se pasarán a la fase posterior de la canalización. Para un sombreador de geometría, la cantidad de salida de datos de una única invocación puede variar. Algunas salidas se interpretan mediante el núcleo común del sombreador (como la posición de los vértices y el índice render-target-array), mientras que otras están diseñadas para ser interpretadas por una aplicación.
  • Código de sombreador: los sombreadores pueden leer desde la memoria, realizar operaciones aritméticas de punto flotante vectorial y entero o operaciones de control de flujo. No hay ningún límite en el número de instrucciones que se pueden implementar en un sombreador.
  • Muestreadores: los muestreadores definen cómo muestrear y filtrar texturas. Se pueden enlazar hasta 16 muestreadores a un sombreador simultáneamente.
  • Texturas: las texturas se pueden filtrar mediante muestreadores o leerse por texel directamente con la función intrínseca de carga.
  • Búferes: los búferes nunca se filtran, pero se pueden leer de la memoria por elemento directamente con la función intrínseca de carga. Se pueden enlazar hasta 128 recursos de textura y búfer (combinados) a un sombreador simultáneamente.
  • Búferes constantes: los búferes constantes están optimizados para las variables constantes del sombreador. Se pueden enlazar hasta 16 búferes constantes a una fase del sombreador simultáneamente. Están diseñados para una actualización más frecuente desde la CPU; por lo tanto, tienen restricciones de tamaño, diseño y acceso adicionales.

Diferencias entre Direct3D 9 y Direct3D 10:

  • En Direct3D 9, cada unidad de sombreador tenía un único archivo de registro constante pequeño para almacenar todas las variables de sombreador constantes. La compatibilidad de todos los sombreadores con este espacio constante limitado requería el reciclaje frecuente de constantes por parte de la CPU.
  • En Direct3D 10, las constantes se almacenan en búferes inmutables en memoria y se administran como cualquier otro recurso. No hay ningún límite en el número de búferes constantes que una aplicación puede crear. Al organizar las constantes en búferes por frecuencia de actualización y uso, se puede reducir considerablemente la cantidad de ancho de banda necesario para actualizar las constantes para dar cabida a todos los sombreadores.

Compatibilidad con enteros y bit a bit

El núcleo común del sombreador proporciona un conjunto completo de operaciones bit a bit y enteros de 32 bits compatibles con IEEE. Estas operaciones permiten una nueva clase de algoritmos en ejemplos de hardware gráfico, como técnicas de compresión y empaquetado, FFT y control de flujo de programa de campo de bits.

Los tipos de datos int y uint de Direct3D 10 HLSL se asignan a enteros de 32 bits en hardware.

Diferencias entre Direct3D 9 y Direct3D 10:
En Direct3D 9, las entradas de flujo marcadas como enteros en HLSL se interpretaron como de punto flotante. En Direct3D 10, las entradas de secuencia marcadas como enteros se interpretan como un entero de 32 bits.
Además, los valores booleanos ahora son todos los bits establecidos o todos los bits sin establecer. Los datos convertidos a bool se interpretarán como true si el valor no es igual a 0,0f (se permite que los ceros positivos y negativos sean false) y false en caso contrario.

Operadores bit a bit

El núcleo común del sombreador admite los siguientes operadores bit a bit:

Operador Función
~ No lógico
<< Desplazamiento a la izquierda
>> Desplazamiento a la derecha
& Logical And
| Or lógico.
^ Xor lógico
<<= Desplazamiento a la izquierda Igual
>>= Desplazamiento a la derecha igual
&= E igual
|= O igual
^= Xor Equal

Los operadores bit a bit se definen para funcionar solo en tipos de datos int y uint. Si se intentan usar operadores bit a bit en tipos de datos float o struct, se producirá un error. Los operadores bit a bit tienen la misma prioridad que C con respecto a otros operadores.

Conversión binaria

La conversión entre un entero y un tipo de punto flotante convertirá el valor numérico siguiendo las reglas de truncamiento de C. Convertir un valor de float en int y volver a float es una conversión con pérdida que depende de la precisión del tipo de datos de destino. Estas son algunas de las funciones de conversión: asfloat (DirectX HLSL), asint (DirectX HLSL), asuint (DirectX HLSL).

Las conversión binarias también se pueden realizar mediante funciones intrínsecas HLSL. Esto hace que el compilador reinterprete la representación de bits de un número en el tipo de datos de destino.

Modelo de sombreador 4