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 funcionalidad única para cada fase, como la capacidad de generar nuevos primitivos 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 del sombreador común con los recursos de memoria del sombreador.

diagrama del flujo de datos en una fase del 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íxeles reciben sus entradas de la fase anterior del sombreador. Entre las entradas adicionales se incluyen la semántica de valor del sistema, que 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. En el caso de un sombreador de geometría, la cantidad de salida de datos de una sola invocación puede variar. Algunas salidas se interpretan mediante el núcleo del sombreador común (como la posición del vértice y el índice render-target-array), otros están diseñados para que una aplicación interprete.
  • Código del sombreador: los sombreadores pueden leer de la memoria, realizar operaciones aritméticas de punto flotante vectorial e 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.
  • Muestradores: los muestradores definen cómo muestrear y filtrar texturas. Hasta 16 muestras se pueden enlazar a un sombreador simultáneamente.
  • Texturas: las texturas se pueden filtrar mediante muestras o leer por elemento de textura 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 . Hasta 128 recursos de textura y búfer (combinados) se pueden enlazar a un sombreador simultáneamente.
  • Búferes de constantes: los búferes de constantes están optimizados para variables constantes del sombreador. Hasta 16 búferes de constantes se pueden enlazar a una fase del sombreador simultáneamente. Están diseñados para una actualización más frecuente de 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. Adaptar todos los sombreadores con este espacio constante limitado requiere el reciclaje frecuente de constantes por 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 de constantes que puede crear una aplicación. Al organizar constantes en búferes por frecuencia de actualización y uso, se puede reducir significativamente la cantidad de ancho de banda necesario para actualizar constantes para adaptarse a todos los sombreadores.

Compatibilidad con enteros y bit a bit

El núcleo del sombreador común proporciona un conjunto completo de operaciones bit a bit y enteros compatibles con IEEE de 32 bits. 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 las entradas de flujo de Direct3D 9 marcadas como enteros en HLSL se interpretaron como punto flotante. En Direct3D 10, las entradas de flujo 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 en bool se interpretarán como true si el valor no es igual a 0,0f (se permite que cero positivo y negativo sea false) y false en caso contrario.

Operadores bit a bit

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

Operador Función
~ NOT lógico
<< Mayús Izq
>> Desplazamiento a la derecha
& Logical And
| Or lógico.
^ Xor lógico
<<= Desplazamiento a la izquierda igual
>>= Desplazamiento a la derecha igual
&= Y igual a
|= O igual que
^= Xor Equal

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

Conversiones binarias

La conversión entre un entero y un tipo de punto flotante convertirá el valor numérico después de las reglas de truncamiento de C. La conversión de un valor de float a un valor int y volver a un valor float es una conversión perdida 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 conversiones binarias también se pueden realizar mediante funciones intrínsecas de 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