Compartir a través de


Subrecursos (gráficos Direct3D 12)

Describe cómo se divide un recurso en subrecursos y cómo hacer referencia a un único, múltiplo o segmento de subrecursos.

Subrecursos de ejemplo

Si un recurso contiene un búfer, simplemente contiene un subrecurso con un índice de 0. Si el recurso contiene una textura (o matriz de texturas), hacer referencia a los subrecursos es más complejo.

Algunas API acceden a un recurso completo (como el método ID3D12GraphicsCommandList::CopyResource ), otros acceden a una parte de un recurso (por ejemplo, el método ID3D12Resource::ReadFromSubresource ). Los métodos que acceden a una parte de un recurso suelen usar una descripción de vista (como la estructura D3D12_TEX2D_ARRAY_SRV ) para especificar los subrecursos a los que se va a acceder. Consulte la sección Api de subrecursos para obtener una lista completa.

Indexación de subrecursos

Para indexar un subrecurso determinado, los niveles mip se indexan primero a medida que se indexa cada entrada de matriz.

indexación de subrecursos

Segmento mip

Un segmento mip incluye un nivel de mapa MIP para cada textura de una matriz, como se muestra en la siguiente imagen.

segmentos mip de subrecurso

Segmento de matriz

Dada una matriz de texturas, cada textura con mapas MIP, un segmento de matriz incluye una textura y todos sus niveles mip, como se muestra en la siguiente imagen.

segmentos de matriz de subrecursos

Segmento de plano

Normalmente, los formatos planar no se usan para almacenar datos RGBA, pero en los casos en los que es (quizás 24bpp datos RGB), un plano podría representar la imagen roja, una verde y otra la imagen azul. Sin embargo, un plano no es necesariamente un color, dos o más colores se pueden combinar en un plano. Normalmente, los datos planar se usan para los datos YCbCr y Depth-Stencil de muestras secundarias. Depth-Stencil es el único formato que admite totalmente mapas MIP, matrices y varios planos (a menudo plano 0 para Profundidad y plano 1 para galería de símbolos).

A continuación se muestra la indexación de subrecursos para una matriz de dos imágenes de Depth-Stencil, cada una con tres niveles mip.

indexación de galería de símbolos de profundidad

YCbCr con muestras secundarias admite matrices y tiene planos, pero no admite mapas MIP. Las imágenes de YCbCr tienen dos planos, uno para la luminancia (Y) al que el ojo humano es más sensible, y uno para la cromoncia (cb, y cr, intercalado) al que el ojo humano es menos sensible. Este formato permite la compresión de los valores de cromo para comprimir una imagen sin afectar a la luminancia, y es un formato de compresión de vídeo común por esa razón, aunque se usa para comprimir imágenes fijas. En la imagen siguiente se muestra el formato NV12, teniendo en cuenta que la crominancia se ha comprimido a un cuarto de la resolución de la luminancia, lo que significa que el ancho de cada plano es idéntico y el plano de crominancia es la mitad del alto del plano de luminancia. Los planos se indexarían como subrecursos de una manera idéntica al ejemplo de Depth-Stencil anterior.

el formato nv12

Los formatos planar existían en Direct3D 11, pero los planos individuales no se podían abordar individualmente, por ejemplo, para las operaciones de copia o asignación. Esto se cambió en Direct3D 12 para que cada plano recibiera su propio identificador de subrecurso. Compare los dos métodos siguientes para calcular el identificador del subrecurso.

Direct3D 11

inline UINT D3D11CalcSubresource( UINT MipSlice, UINT ArraySlice, UINT MipLevels )
{
    return MipSlice + (ArraySlice * MipLevels); 
}

Direct3D 12

inline UINT D3D12CalcSubresource( UINT MipSlice, UINT ArraySlice, UINT PlaneSlice, UINT MipLevels, UINT ArraySize )
{ 
    return MipSlice + (ArraySlice * MipLevels) + (PlaneSlice * MipLevels * ArraySize); 
}

La mayoría del hardware supone que la memoria del plano N siempre se asigna inmediatamente después del plano N-1.

Una alternativa al uso de subrecursos es que una aplicación podría asignar un recurso completamente independiente por plano. En este caso, la aplicación entiende que los datos son planos y usan varios recursos para representarlos.

Varios subrecursos

Una vista de recursos de sombreador puede seleccionar cualquier región rectangular de subrecursos, mediante uno de los segmentos descritos anteriormente y un uso prudente de campos en las estructuras de vista (como D3D12_TEX2D_ARRAY_SRV), como se muestra en la imagen.

selección de varios subrecursos

Una vista de destino de representación solo puede usar un solo subrecurso o segmento mip y no puede incluir subrecursos de más de un segmento mip. Es decir, todas las texturas de una vista de destino de representación deben tener el mismo tamaño. Una vista sombreador-recurso puede seleccionar cualquier región rectangular de subrecursos, como se muestra en la imagen.

API de subrecurso

Las siguientes API hacen referencia y funcionan con subrecursos:

Enumeraciones:

Las estructuras siguientes contienen índices PlaneSlice , la mayoría contienen índices MipSlice .

Las estructuras siguientes contienen índices ArraySlice , la mayoría contienen índices MipSlice .

Las estructuras siguientes contienen índices MipSlice , pero no los índices ArraySlice ni PlaneSlice .

Las estructuras siguientes también hacen referencia a subrecursos:

Métodos:

Las texturas deben estar en el estado D3D12_RESOURCE_STATE_COMMON para el acceso a la CPU a través de WriteToSubresource y ReadFromSubresource para que sea legal; pero los búferes no lo hacen. Normalmente, el acceso de CPU a un recurso se realiza mediante asignar/ unmapa.

Enlace de recursos