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 de 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 para 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 de sombreador y la relación del núcleo del sombreador común con recursos de memoria del sombreador.

diagram of data flow in a shader stage

  • 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 del valor del sistema, que es consumible por 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 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 ser interpretados por una aplicación.
  • Código del sombreador: los sombreadores pueden leer desde 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.
  • Samplers: los muestreadores definen cómo muestrear y filtrar texturas. Hasta 16 muestreadores se pueden enlazar a un sombreador simultáneamente.
  • Texturas: las texturas se pueden filtrar mediante muestras o leerse por textura directamente con la función intrínseca de carga .
  • Búferes: los búferes nunca se filtran, pero se pueden leer desde 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 de 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. Acomodar 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 de sombreador común proporciona un conjunto completo de operaciones de enteros de 32 bits y bit a bit 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 las entradas de flujo de Direct3D 9 marcadas como enteros en HLSL se interpretaron como 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 en bool se interpretarán como true si el valor no es igual a 0,0f (se permite que cero positivo y negativo sean 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
<< Desplazamiento a la izquierda
>> Desplazamiento a la derecha
& Logical And
| Or lógico.
^ Xor lógico
<<= Desplazamiento izquierdo igual
>>= Desplazamiento a la derecha igual
&= Y iguales
|= 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 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. Convertir un valor de un valor float en un valor int y volver a un float es una conversión perdida dependiente 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 interprete la representación de bits de un número en el tipo de datos de destino.

Modelo de sombreador 4