Ejemplos de firmas raíz
En la sección siguiente se muestran las firmas raíz que varían en complejidad de vacío a completo.
- Una firma raíz vacía
- Una constante
- Adición de una vista de búfer de constantes raíz
- Enlazar tablas de descriptores
- Una firma raíz más compleja
- Vistas de recursos del sombreador de streaming
- Temas relacionados
Una firma raíz vacía
Es poco probable que una firma raíz vacía sea útil, pero podría usarse en un pase de representación trivial con solo el ensamblador de entrada, así como sombreadores de vértices y píxeles mínimos que no tienen acceso a ningún descriptor. También están disponibles la fase de mezcla, las fases de destino de representación y galería de símbolos de profundidad, incluso con una firma raíz vacía.
Una constante
La ranura de enlace de API es donde el argumento raíz de este parámetro se enlazará en tiempo de registro de lista de comandos. El número de ranuras de enlace de API es implícito, en función del orden de los parámetros de la firma raíz (el primero siempre es cero). La ranura de enlace HLSL es donde el sombreador verá que se muestra el parámetro raíz. El tipo ("uint" en el ejemplo anterior) no es conocido por el hardware, pero es solo un comentario en la imagen, el hardware simplemente verá el único DWORD como contenido.
Para enlazar una constante en tiempo de registro de lista de comandos, se usaría un comando similar al siguiente:
pCmdList->SetComputeRoot32BitConstant(0,seed); // 0 is the parameter index, seed is used by the shaders
Adición de una vista de búfer de constantes raíz
En este ejemplo se muestran dos constantes raíz y una vista raíz del búfer de constantes (CBV) que cuesta dos ranuras DWORD.
Para enlazar una vista de búfer de constantes, use un comando como el siguiente. Tenga en cuenta que el primer parámetro (2) es la ranura que se muestra en la imagen. Normalmente, se configurará una matriz de constantes y, a continuación, se pondrá a disposición de los sombreadores en b0 como CBV.
pCmdList->SetGraphicsRootConstantBufferView(2,GPUVAForCurrDynamicConstants);
Enlazar tablas de descriptores
En este ejemplo se muestra el uso de dos tablas de descriptores; una que declara una tabla de cinco descriptores que estarán disponibles en tiempo de ejecución en un montón de descriptores de CBV_SRV_UAV y otro que declara una tabla de dos descriptores que se mostrarán en tiempo de ejecución en un montón de descriptores de ejemplo.
Para enlazar tablas de descriptores al grabar una lista de comandos.
pCmdList->SetComputeRootDescriptorTable(1, handleToCurrentMaterialDataInHeap);
pCmdList->SetComputeRootDescriptorTable(2, handleToCurrentMaterialDataInSamplerHeap);
Otra característica de la firma raíz es la constante raíz float4 que tiene cuatro DWORDS de tamaño. El siguiente comando enlaza solo las dos DWORDS intermedias de los cuatro.
pCmdList->SetComputeRoot32BitConstants(0,2,myFloat2Array,1); // 2 constants starting at offset 1 (middle 2 values in float4)
Una firma raíz más compleja
En este ejemplo se muestra una firma raíz densa con la mayoría de los tipos de entradas. Dos de las tablas descriptores (en las ranuras 3 y 6) incluyen matrices de tamaño sin enlazar. La carga aquí está en la aplicación para que solo toque descriptores válidos en un montón. Las matrices sin enlazar o muy grandes requieren un nivel de hardware 2+ de compatibilidad con el enlace de recursos.
Hay dos muestreadores estáticos (enlazados sin necesidad de ranuras de firma raíz).
En la ranura 9, UAV u4 y UAV u5 se declaran en el mismo desplazamiento de tabla descriptor. Este es el uso de un descriptor con alias, un descriptor en memoria se mostrará como u4 y u5 en los sombreadores HLSL. En este caso, el sombreador debe compilarse con la opción D3D10_SHADER_RESOURCES_MAY_ALIAS, o la opción o /res_may_alias
en FXC. Los descriptores con alias permiten enlazar un descriptor a varios puntos de enlace, sin tener que realizar ningún cambio en los sombreadores.
Vistas de recursos del sombreador de streaming
Esta firma raíz muestra un escenario en el que todos los SRV se transmiten dentro y fuera de una matriz grande. En tiempo de ejecución, se puede establecer una tabla de descriptores una vez cuando se establece la firma raíz. A continuación, todas las lecturas de textura se realizan indexando en la matriz a través de constantes alimentadas a través de los primeros argumentos raíz. Solo se necesita un montón de descriptores único y solo se actualiza a medida que las texturas se transmiten dentro o fuera de las ranuras de descriptores libres.
Los desplazamientos del descriptor en el montón grande se identifican mediante sombreadores que usan las constantes en las vistas de búfer de constantes. Por ejemplo, si a un sombreador se le asigna un identificador de material, puede indexar en la matriz grande mediante la constante para acceder al descriptor necesario (que hace referencia a la textura necesaria).
Este escenario requiere hardware con el nivel de enlace de recursos2+.
Temas relacionados