Compartir a través de


Introducción a un recurso en Direct3D 11

Los recursos son los bloques de creación de la escena. Contienen la mayoría de los datos que Usa Direct3D para interpretar y representar la escena. Los recursos son áreas en memoria a las que puede acceder la canalización de Direct3D. Los recursos contienen los siguientes tipos de datos: geometría, texturas, datos de sombreador. En este tema se presentan recursos de Direct3D, como búferes y texturas.

Puede crear recursos fuertemente tipados o sin tipo; puede controlar si los recursos tienen acceso de lectura y escritura; puede hacer que los recursos sean accesibles solo para la CPU, la GPU o ambos. Se pueden activar hasta 128 recursos para cada fase de la canalización.

Direct3D garantiza que devuelve cero para cualquier recurso al que se tenga acceso fuera de los límites.

El ciclo de vida de un recurso de Direct3D es:

  • Cree un recurso mediante uno de los métodos de creación de la interfaz ID3D11Device .
  • Enlace un recurso a la canalización mediante un contexto y uno de los métodos set de la interfaz ID3D11DeviceContext .
  • Desasigne un recurso llamando al método Release de la interfaz de recursos.

Esta sección contiene los siguientes temas:

Escritura fuerte frente a débil

Hay dos maneras de especificar completamente el diseño (o superficie de memoria) de un recurso:

  • Con tipo: especifique completamente el tipo cuando se crea el recurso.
  • Sin tipo: especifique completamente el tipo cuando el recurso está enlazado a la canalización.

La creación de un recurso totalmente tipado restringe el recurso al formato con el que se creó. Esto permite que el tiempo de ejecución optimice el acceso, especialmente si el recurso se crea con marcas que indican que la aplicación no puede asignarlo. Los recursos creados con un tipo específico no se pueden reinterpretar mediante el mecanismo de vista a menos que el recurso se haya creado con la marca D3D10_DDI_BIND_PRESENT. Si se establece D3D10_DDI_BIND_PRESENT, se pueden crear vistas de recursos de destino de representación o sombreador en estos recursos mediante cualquiera de los miembros totalmente tipados de la familia adecuada, incluso si el recurso original se creó como totalmente tipado.

En un tipo menos de recurso, el tipo de datos se desconoce cuando se crea el recurso por primera vez. La aplicación debe elegir entre los formatos disponibles (consulte DXGI_FORMAT). Debe especificar el tamaño de la memoria que se va a asignar y si el tiempo de ejecución tendrá que generar las subtexturas en un mapa MIP. Sin embargo, el formato de datos exacto (si la memoria se interpretará como enteros, valores de punto flotante, enteros sin signo, etc.) no se determina hasta que el recurso se enlaza a la canalización con una vista de recursos. Como el formato de textura permanece flexible hasta que la textura está enlazada a la canalización, el recurso se conoce como almacenamiento débilmente tipado. El almacenamiento débilmente tipado tiene la ventaja de que se puede reutilizar o reinterpretar en otro formato siempre que el número de componentes y el recuento de bits de cada componente sean los mismos en ambos formatos.

Un único recurso se puede enlazar a varias fases de canalización siempre que cada una tenga una vista única, que califica completamente los formatos en cada ubicación. Por ejemplo, un recurso creado con el formato DXGI_FORMAT_R32G32B32A32_TYPELESS podría usarse como un DXGI_FORMAT_R32G32B32A32_FLOAT y un DXGI_FORMAT_R32G32B32A32_UINT en diferentes ubicaciones de la canalización simultáneamente.

Vistas de recursos

Los recursos se pueden almacenar en formatos de memoria de uso general para que puedan compartirlos varias fases de canalización. Una fase de canalización interpreta los datos de recursos mediante una vista. Una vista de recursos es conceptualmente similar a la conversión de los datos de recursos para que se pueda usar en un contexto determinado.

Se puede usar una vista con un recurso sin tipos. Es decir, puede crear un recurso en tiempo de compilación y declarar el tipo de datos cuando el recurso está enlazado a la canalización. Una vista creada para un recurso sin tipo siempre tiene el mismo número de bits por componente; la forma en que se interpretan los datos depende del formato especificado. El formato especificado debe ser de la misma familia que el formato sin tipo utilizado al crear el recurso. Por ejemplo, un recurso creado con el formato R8G8B8A8_TYPELESS no se puede ver como un recurso de R32_FLOAT, aunque ambos formatos pueden tener el mismo tamaño en memoria.

Una vista también expone otras funcionalidades, como la capacidad de leer superficies de profundidad/galería de símbolos en un sombreador, generar un mapa de cubo dinámico en un solo paso y representar simultáneamente en varios segmentos de un volumen.

Interfaz de recursos Descripción
ID3D11DepthStencilView Acceda a un recurso de textura durante las pruebas de galería de símbolos de profundidad.
ID3D11RenderTargetView Acceda a un recurso de textura que se usa como destino de representación.
ID3D11ShaderResourceView Acceda a un recurso de sombreador, como un búfer de constantes, un búfer de texturas, una textura o un sampler.
ID3D11UnorderedAccessView Acceda a un recurso desordenado mediante un sombreador de píxeles o un sombreador de proceso.

 

Vistas sin procesar de búferes

Puede pensar en un búfer sin formato, que también se puede denominar búfer de direcciones de bytes, como un contenedor de bits al que desea acceder sin procesar, es decir, un búfer al que puede acceder convenientemente a través de fragmentos de uno a cuatro valores de dirección sin tipo de 32 bits. Indica que desea obtener acceso sin procesar a un búfer (o, una vista sin procesar de un búfer) al llamar a uno de los métodos siguientes para crear una vista al búfer:

Puede usar los tipos de objetos HLSL ByteAddressBuffer y RWByteAddressBuffer al trabajar con búferes sin procesar.

Para crear una vista sin procesar en un búfer, primero debe llamar a ID3D11Device::CreateBuffer con la marca D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS para crear el recurso de búfer subyacente. Especifique esta marca en el miembro MiscFlags de la estructura D3D11_BUFFER_DESC a la que apunta el parámetro pDesc de ID3D11Device::CreateBuffer . No se puede combinar la marca de D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS con D3D11_RESOURCE_MISC_BUFFER_STRUCTURED. Además, si especifica D3D11_BIND_CONSTANT_BUFFER en BindFlags de D3D11_BUFFER_DESC, tampoco puede especificar D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS en MiscFlags. Esto no es una limitación de solo vistas sin procesar porque los búferes de constantes ya tienen una restricción que no se pueden combinar con ninguna otra vista.

Aparte de los casos no válidos anteriores, al crear un búfer con D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS, no está limitado en la funcionalidad frente a no establecer D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS. Es decir, puedes usar este tipo de búfer para el acceso no sin procesar de cualquier manera que sea posible con Direct3D. Si especifica la marca D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS , solo aumenta la funcionalidad disponible.

Recursos

Nuevos tipos de recursos