Compartir a través de


Tipos de recursos (Direct3D 10)

Todos los recursos usados por la canalización de Direct3D derivan de dos tipos de recursos básicos: búferes y texturas. Un búfer es una colección de datos sin procesar (elementos); una textura es una colección de elementos de textura (elementos de textura).

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

Elemento Descripción
Escrito
Especifique completamente el tipo cuando se cree el recurso.
Sin tipo
Especifique completamente el tipo cuando el recurso esté enlazado a la canalización.

 

Recursos de búfer

Un recurso de búfer es una colección de datos totalmente tipados; internamente, un búfer contiene elementos. Un elemento consta de 1 a 4 componentes. Algunos ejemplos de tipos de datos de elementos son: un valor de datos empaquetado (como R8G8B8A8), un único entero de 8 bits, cuatro valores flotantes de 32 bits. Estos tipos de datos se usan para almacenar datos, como un vector de posición, un vector normal, una coordenada de textura en un búfer de vértices, un índice en un búfer de índice o un estado del dispositivo.

Se crea un búfer como un recurso no estructurado. Dado que no está estructurado, un búfer no puede contener ningún nivel de mapa mip, no se filtra cuando se lee y no puede ser multimuestreo.

Tipos de búfer

Búfer de vértices

Un búfer es una colección de elementos; un búfer de vértices contiene datos por vértice. El ejemplo más sencillo es un búfer de vértices que contiene un tipo de datos, como los datos de posición. Se puede visualizar como la siguiente ilustración.

Ilustración de un búfer de vértices que contiene datos de posición

Con más frecuencia, un búfer de vértices contiene todos los datos necesarios para especificar completamente vértices 3D. Un ejemplo de esto podría ser un búfer de vértices que contiene la posición por vértice, las coordenadas normales y de textura. Normalmente, estos datos se organizan como conjuntos de elementos por vértice, como se muestra en la ilustración siguiente.

Ilustración de un búfer de vértices que contiene datos de posición, normal y textura

Este búfer de vértices contiene datos por vértice para ocho vértices; cada vértice almacena tres elementos (coordenadas de posición, normal y textura). La posición y la normalidad se especifican normalmente con tres floats de 32 bits (DXGI_FORMAT_R32G32B32_FLOAT) y las coordenadas de textura con dos floats de 32 bits (DXGI_FORMAT_R32G32_FLOAT).

Para acceder a los datos desde un búfer de vértices, debe saber a qué vértice acceder y a estos otros parámetros de búfer:

  • Desplazamiento: el número de bytes desde el inicio del búfer hasta los datos del primer vértice. El desplazamiento se proporciona a IASetVertexBuffers.
  • BaseVertexLocation: el número de bytes del desplazamiento al primer vértice utilizado por la llamada de dibujo adecuada (vea Métodos draw).

Antes de crear un búfer de vértices, debe definir su diseño mediante la creación de un objeto de diseño de entrada; esto se realiza mediante una llamada a CreateInputLayout. Una vez creado el objeto de diseño de entrada, vincule a la fase del ensamblador de entrada llamando a IASetInputLayout.

Para crear un búfer de vértices, llame a CreateBuffer.

Búfer de índice

Un búfer de índice contiene un conjunto secuencial de índices de 16 o 32 bits; cada índice se usa para identificar un vértice en un búfer de vértices. El uso de un búfer de índice con uno o varios búferes de vértices para proporcionar datos a la fase de IA se denomina indexación. Un búfer de índice se puede visualizar como la ilustración siguiente.

Ilustración de un búfer de índice

Los índices secuenciales almacenados en un búfer de índice se encuentran con los parámetros siguientes:

  • Desplazamiento: el número de bytes desde el inicio del búfer hasta el primer índice. El desplazamiento se proporciona a IASetIndexBuffer.
  • StartIndexLocation: el número de bytes del desplazamiento al primer vértice usado por la llamada de dibujo adecuada (vea Métodos draw).
  • IndexCount: el número de índices que se van a representar.

Para crear un búfer de índice, llame a CreateBuffer.

Un búfer de índice puede unir varias franjas de líneas o triángulos separando cada una con un índice de corte de franjas. Un índice de corte de franja permite dibujar varias franjas de líneas o triángulos con una sola llamada de dibujo. Un índice de corte de bandas es simplemente el valor máximo posible para el índice (0xffff para un índice de 16 bits, 0xffffffff para un índice de 32 bits). El índice de corte de franja restablece el orden de desvanado en primitivos indizado y se puede usar para eliminar la necesidad de degenerar triángulos que, de lo contrario, pueden ser necesarios para mantener el orden de desvanado adecuado en una franja de triángulos. En la ilustración siguiente se muestra un ejemplo de un índice de corte de franjas.

Ilustración de un índice de corte de franjas

Búfer de constantes

Direct3D 10 introdujo un nuevo búfer para proporcionar constantes de sombreador denominadas búfer de constantes de sombreador o simplemente un búfer de constantes. Conceptualmente, parece un búfer de vértices de un solo elemento, como se muestra en la ilustración siguiente.

Ilustración de un búfer de constantes de sombreador

Cada elemento almacena una constante de componente de 1 a 4, determinada por el formato de los datos almacenados.

Los búferes de constantes reducen el ancho de banda necesario para actualizar las constantes del sombreador al permitir que las constantes del sombreador se agrupen y confirmen al mismo tiempo en lugar de realizar llamadas individuales para confirmar cada constante por separado.

Para crear un búfer de constantes de sombreador, llame a CreateBuffer y especifique la marca de enlace de búfer de constantes D3D10_BIND_CONSTANT_BUFFER (consulte D3D10_BIND_FLAG).

Para enlazar un búfer de constantes de sombreador a la canalización, llame a uno de estos métodos: GSSetConstantBuffers, PSSetConstantBuffers o VSSetConstantBuffers.

Tenga en cuenta que cuando se usa la interfaz ID3D10Effect Interface, la instancia de ID3D10Effect Interface controla el proceso de creación, enlace y comitting de un búfer de constantes. En ese caso, solo es necesario obtener la variable del efecto con uno de los métodos GetVariable como GetVariableByName y actualizar la variable con uno de los métodos SetVariable, como SetMatrix. Para obtener un ejemplo del uso de la interfaz ID3D10Effect para administrar un búfer de constantes, consulte el tutorial 07.

Un sombreador sigue leyendo variables en un búfer de constantes directamente por nombre de variable de la misma manera que las variables que no forman parte de un búfer de constantes se leen.

Cada fase del sombreador permite hasta 15 búferes de constantes de sombreador; cada búfer puede contener hasta 4096 constantes.

Use un búfer de constantes para almacenar los resultados de la fase de salida del flujo.

Consulte Constantes de sombreador (DirectX HLSL) para obtener un ejemplo de declaración de un búfer de constantes en un sombreador.

Recursos de texturas

Un recurso de textura es una colección estructurada de datos diseñados para almacenar elementos de textura. A diferencia de los búferes, las texturas se pueden filtrar por muestras de textura a medida que las unidades del sombreador las leen. El tipo de textura afecta a cómo se filtra la textura. Un elemento de textura representa la unidad más pequeña de una textura en la que la canalización puede leer o escribir. Cada elemento de textura contiene de 1 a 4 componentes, organizados en uno de los formatos DXGI (consulte DXGI_FORMAT).

Las texturas se crean como un recurso estructurado para que se conozca su tamaño. Sin embargo, cada textura puede escribirse o escribirse menos en tiempo de creación de recursos, siempre y cuando el tipo se especifique completamente mediante una vista cuando la textura esté enlazada a la canalización.

Tipos de textura

Hay varios tipos de texturas: 1D, 2D, 3D, cada uno de los cuales se puede crear con o sin mapas mip. Direct3D 10 también admite matrices de texturas y texturas de muestreo múltiple.

Textura 1D

Una textura 1D en su forma más sencilla contiene datos de textura que se pueden abordar con una sola coordenada de textura; se puede visualizar como una matriz de elementos de textura, como se muestra en la ilustración siguiente.

ilustración de una textura 1d

Cada elemento de textura contiene una serie de componentes de color en función del formato de los datos almacenados. Si agrega más complejidad, puede crear una textura 1D con niveles de mapa mip, como se muestra en la ilustración siguiente.

Ilustración de una textura 1d con niveles de mapa mip

Un nivel de mapa mip es una textura que es una potencia de dos menor que el nivel anterior. El nivel superior contiene los detalles más detallados, cada nivel posterior es menor; para un mapa mip 1D, el nivel más pequeño contiene un elemento de textura. Los distintos niveles se identifican mediante un índice denominado LOD (nivel de detalle); Puede usar el LOD para acceder a una textura más pequeña al representar la geometría que no está tan cerca de la cámara.

Matriz de texturas 1D

Direct3D 10 también tiene una nueva estructura de datos para una matriz de texturas. Una matriz de texturas 1D se parece conceptualmente a la siguiente ilustración.

Ilustración de una matriz de texturas 1d

Esta matriz de texturas contiene tres texturas. Cada una de las tres texturas tiene un ancho de textura de 5 (que es el número de elementos de la primera capa). Cada textura también contiene un mapa mip de 3 capas.

Todas las matrices de texturas de Direct3D son una matriz homogénea de texturas; esto significa que cada textura de una matriz de texturas debe tener el mismo formato y tamaño de datos (incluido el ancho de textura y el número de niveles de mapa mip). Puede crear matrices de texturas de diferentes tamaños, siempre y cuando todas las texturas de cada matriz coincidan con el tamaño.

Textura 2D y matriz de texturas 2D

Un recurso Texture2D contiene una cuadrícula 2D de elementos de textura. Cada elemento de textura es direccionable por un vector u, v. Dado que es un recurso de textura, puede contener niveles de mapa mip y subrecursos. Un recurso de textura 2D rellenado completamente tiene el aspecto de la siguiente ilustración.

ilustración de un recurso de textura 2d

Este recurso de textura contiene una sola textura de 3x5 con tres niveles de mapa mip.

Un recurso Texture2DArray es una matriz homogénea de texturas 2D; es decir, cada textura tiene el mismo formato de datos y dimensiones (incluidos los niveles de mapa mip). Tiene un diseño similar a la matriz de texturas 1D, excepto que las texturas ahora contienen datos 2D y, por lo tanto, se parece a la siguiente ilustración.

ilustración de una matriz de recursos de textura 2d

Esta matriz de texturas contiene tres texturas; cada textura es 3x5 con dos niveles de mapa mip.

Uso de Texture2DArray como cubo de textura

Un cubo de textura es una matriz de texturas 2D que contiene 6 texturas, una para cada cara del cubo. Un cubo de textura completamente rellenado tiene el aspecto de la siguiente ilustración.

ilustración de una matriz de recursos de textura 2d que representan un cubo de textura

Una matriz de texturas 2D que contiene 6 texturas se puede leer desde los sombreadores con las funciones intrínsecas del mapa de cubos, después de enlazarlas a la canalización con una vista de textura de cubo. Los cubos de textura se abordan desde el sombreador con un vector 3D que señala desde el centro del cubo de textura.

Textura 3D

Un recurso Texture3D (también conocido como textura de volumen) contiene un volumen 3D de elementos de textura. Dado que es un recurso de textura, puede contener niveles de mapa mip. Una textura 3D totalmente rellenada es similar a la siguiente ilustración.

Ilustración de un recurso de textura 3d

Cuando un segmento de mapa mip de textura 3D se enlaza como una salida de destino de representación (con una vista de destino de representación), la textura 3D se comporta de forma idéntica a una matriz de texturas 2D con n segmentos. El segmento de representación concreto se elige en la fase del sombreador geometry, declarando un componente escalar de los datos de salida como el SV_RenderTargetArrayIndex valor del sistema.

No existe ningún concepto de una matriz de texturas 3D; por lo tanto, un subrecurso de textura 3D es un solo nivel de mapa mip.

Subrecursos

La API de Direct3D 10 hace referencia a recursos completos o subconjuntos de recursos. Para especificar parte de los recursos, Direct3D ha codificado el término subrecursos, lo que significa un subconjunto de un recurso.

Un búfer se define como un único subrecurso. Las texturas son un poco más complicadas, ya que hay varios tipos de textura diferentes (1D, 2D, etc.) algunos de los cuales admiten niveles de mapa mip o matrices de texturas. A partir del caso más sencillo, una textura 1D se define como un único subrecurso, como se muestra en la ilustración siguiente.

ilustración de una textura 1d

Esto significa que la matriz de elementos de textura que componen una textura 1D se incluye en un único subrecurso.

Si expande una textura 1D con tres niveles de mapa mip, se puede visualizar de esta manera.

Ilustración de una textura 1d con niveles de mapa mip

Piense en esto como una sola textura formada por tres subtexturas. Cada subtextura se cuenta como un subrecurso, por lo que esta textura 1D contiene 3 subrecursos. Una subtextura (o subrecurso) se puede indexar mediante el nivel de detalle (LOD) para una sola textura. Cuando se usa una matriz de texturas, el acceso a una subtextura determinada requiere el LOD y la textura determinada. Como alternativa, la API combina estos dos fragmentos de información en un único índice de subrecurso basado en cero, como se muestra aquí.

Ilustración de un índice de subrecurso basado en cero

Selección de subrecursos

Algunas API acceden a un recurso completo (por ejemplo, CopyResource), otros acceden a una parte de un recurso (por ejemplo, UpdateSubresource o CopySubresourceRegion). La API que tiene acceso a una parte de un recurso suele usar una descripción de vista (como D3D10_TEX2D_ARRAY_DSV) para especificar los subrecursos a los que acceder.

Estas ilustraciones muestran los términos utilizados por una descripción de vista al acceder a una matriz de texturas.

Segmento de matriz

Dada una matriz de texturas, cada textura con mapas mip, un segmento de matriz (representado por el rectángulo blanco) incluye una textura y todas sus subtexturas, como se muestra en la ilustración siguiente.

Ilustración de una splice de matriz

Segmento mip

Un segmento mip (representado por el rectángulo blanco) incluye un nivel de mapa mip para cada textura de una matriz, como se muestra en la ilustración siguiente.

Ilustración de una splice mip

Selección de un único subrecurso

Puede usar estos dos tipos de segmentos para elegir un único subrecurso, como se muestra en la ilustración siguiente.

Ilustración de cómo elegir un subrecurso mediante un segmento de matriz y una splice mip

Selección de varios subrecursos

O bien, puede usar estos dos tipos de segmentos con el número de niveles de mapa mip o el número de texturas, para elegir varios subrecursos.

Ilustración de cómo elegir varios subrecursos

Independientemente del tipo de textura que use, con o sin mapas mip, con o sin una matriz de texturas, puede usar la función auxiliar D3D10CalcSubresource para calcular el índice de un subrecurso determinado.

Escritura fuerte frente a débil

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.

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 de tipo menos 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 esté enlazado a la canalización con una vista. Dado que el formato de textura sigue siendo 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 bit de componente del nuevo formato coincida con el recuento de bits del formato anterior.

Un único recurso se puede enlazar a varias fases de canalización siempre que cada uno 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 DXGI_FORMAT_R32G32B32A32_FLOAT y un DXGI_FORMAT_R32G32B32A32_UINT en diferentes ubicaciones de la canalización simultáneamente.

Recursos (Direct3D 10)