Compatibilidad con mallas en D3DX (Direct3D 9)
D3DX es una biblioteca de utilidades que proporciona servicios auxiliares. Es una capa que se encuentra encima del componente Direct3D.
Mallas
D3DX implementa la construcción de malla para cargar, manipular y representar el contenido de un archivo .x. Una malla es básicamente una colección de vértices que definen alguna geometría y un conjunto de índices que definen las caras. Hay varios tipos de malla.
ID3DXBaseMesh proporciona los aspectos básicos. ID3DXMesh es herencia de ID3DXBaseMesh y agrega optimización de malla mediante la caché de vértices por chip. ID3DXSkinInfo proporciona compatibilidad con mallas con máscara.
ID3DXBaseMesh proporciona distintos métodos para manipular y consultar objetos de la malla ID3DXMesh, que heredan de la malla base. Aquí se incluyen operaciones de adyacencia, la recuperación del búfer de geometría, operaciones de bloqueo y desbloqueo (vértice e índice), e información de copia, representación, caras y vértices.
Nota:
Se han eliminado las interfaces de ID3DXPMesh e ID3DXSPMesh (que admiten mallas progresivas y simplificadas, respectivamente) disponibles en las versiones anteriores de Direct3D 9.
Arquitectura de malla
Las mallas contienen datos de modelos complejos. Es un contenedor de datos abstractos que contiene recursos como texturas y materiales, y atributos como datos de posición y datos de adyacencia. Hay varias operaciones de malla que mejoran el rendimiento del dibujo y la apariencia de una superficie. Además, hay otros conceptos de malla que afectarán a la funcionalidad de las operaciones de la malla. Conocer estos conceptos de malla, con el fin de poder aplicarlos, mejorará el rendimiento de la malla.
Datos del objeto malla
Una malla contiene un búfer de vértices, un búfer de índice y un búfer de atributos.
- El búfer de vértices contiene los datos de vértice, que son los vértices de malla.
- El búfer de índice contiene índices de vértices para acceder al búfer de vértices. Esto puede reducir el tamaño del búfer de vértices mediante la reducción de los vértices duplicados. Las mallas indexadas son las únicas que usan el búfer de índice. Si una malla está compuesta de una lista de triángulos, por ejemplo, no usa el búfer de índice.
- El búfer de atributos contiene datos de atributos. Los atributos son propiedades de los vértices de malla y no tienen ningún orden determinado. Las mallas de D3DX almacenan atributos en un grupo de DWORDS, para cada cara.
Tablas de atributos
Una tabla de atributos es una representación concisa del contenido de un búfer de atributos. Para crear tablas de atributos es preciso realizar cualquiera de las siguientes acciones: llamar a uno de los métodos Optimize con D3DXMESHOPT_ATTRSORT, bloquear el búfer de atributos y rellenarlo con datos, o llamar a SetAttributeTable. Las mallas contiene tablas de atributos cuando se reordenan en grupos. Esto sucede cuando se llama a Optimize, siempre que se proporcione una opción de ordenación de atributos (D3DXMESHOPT_ATTRSORT o superior). Las mallas D3DX usan listas de triángulos indexados y, por tanto, se dibujan con IDirect3DDevice9::DrawIndexedPrimitive.
Las tablas de atributos se crean como resultado de llamar a Optimize. Las caras no tienen que ser adyacentes, ya que Optimize las reordenará para que lo sean. Por ejemplo, las manos de una malla humana podrían usar el mismo atributo. El identificador ayuda a ordenar las caras en grupos. Las mallas de archivos .x han generado automáticamente atributos para propiedades de material y textura. Para obtener un buen rendimiento debe llamar a Optimize(ATTRSORT) o al más eficaz Optimize(VERTEXCACHE). Las funciones de carga intentan presentar los datos en el formato exacto en el que se guardaron. Si usa una malla basada en un búfer de vértices o un búfer de índice, la API de malla proporciona funciones de optimización y transformaciones de máscara con poca sobrecarga.
Los tipos de optimización son acumulativos, empiezan por el menos óptimo (D3DXMESHOPT_COMPACT) y van hasta el más óptimo (D3DXMESHOPT_IGNOREVERTS). D3DXMESHOPT_STRIPREORDER realiza una organización de los atributos y de la compactación. D3DXMESHOPT_VERTEXCACHE siempre se recomienda, incluso en dispositivos sin una verdadera memoria caché de vértices.
Datos de programa
Los datos de aplicaciones son datos de malla administrados por una aplicación. Hay un acoplamiento ajustado entre los datos de vértices de malla y los datos administrados por estos búferes.
El búfer de materiales contiene n materiales. La función Load devuelve los materiales cuando se carga el archivo .x. Cada subconjunto puede tener sus propios materiales y texturas. El búfer de materiales es estático.
El búfer de adyacencia contiene información sobre los bordes, las caras y las caras adyacentes. Algunas operaciones de malla dependen de saber qué caras están adyacentes entre sí. Esta información, denominada datos de adyacencia, se conserva en un búfer de adyacencia. No forma parte de la malla, pero la mantiene la aplicación y se debe proporcionar a los métodos de malla cuando sea necesario.
El búfer de instancia de efectos contiene una lista de instancias de efecto. Las instancias de efecto almacenan el estado. Esta información sobre el estado se usa para inicializar la canalización. Las instancias de efecto contienen pares de nombre-valor en un efecto.
Temas de malla avanzados
Las mallas optimizadas se basan en la funcionalidad de malla base y agregan la capacidad de optimización de caché de vértices con dos métodos: Optimize, que crea una malla y OptimizeInPlace, que modifica la malla original.
D3DXGeneratePMesh usa el algoritmo de simplificación de D3DX para generar una malla progresiva a partir de la malla de entrada. D3DXSimplifyMesh genera una malla estándar del nivel de detalle especificado a partir de una malla de entrada, y para ello usa el mismo algoritmo de simplificación. El usuario tiene control sobre la métrica de error que se usa a través de los pesos especificados por componente de vértice y los especificados por vértice. Los pasos por componente se multiplican por la parte de error de dicho componente calculada por colapso perimetral. Los pesos por vértice se multiplican por el valor de métrica de error determinado para la eliminación del vértice en cuestión. Por ejemplo, si desea que algún vértice no se quite nunca, establezca un valor grande en el peso ponderación del vértice en cuestión. Por el contrario, si desea que se quite pronto, establezca un valor pequeño (menor que 1).
ID3DXSkinInfo admite caracteres con máscara. Este tipo de caracteres se define mediante un conjunto de mallas y un conjunto de huesos que afectan a los vértices de las mallas. Los huesos se representan como una jerarquía de transformación. En cada malla, existe una matriz para cada hueso que la afecta, que transforma la malla en el espacio de coordenadas local del hueso. Esta matriz es la transformación del espacio óseo del hueso para la malla. Esto se define en el mismo momento en que el esqueleto se asocia a la malla en el proceso de creación.
Asignación de esqueleto
La asignación de esqueleto (skinning) es una técnica para transformar los vértices de una malla mediante huesos. Los huesos normalmente se organizan en un esqueleto jerárquico, de forma muy parecida a como lo hacen los huesos de un cuerpo humano. Luego, los vértices del objeto se asocian a los huesos, de forma similar a como se une la piel a los huesos. Cuando los huesos se transforman, también lo hace la piel.
Las mallas con máscara usan huesos para influir en varios vértices. El usuario proporciona datos de la transformación ósea, con el fin de influir en la forma en que cómo se usa SRT con los huesos. La malla utiliza los huesos transformados para influir en los vértices asociados a los huesos. Las paletas son matrices de transformaciones de SRT. A menudo, las paletas se implementan como matrices, pero pueden contener valores de SRT.
Recorte de mallas progresivas
Las áreas con poco detalle bajas pueden permitirse perder vértices que no cambian la apariencia representada de la superficie. Esto sucede especialmente en los objetos a medida que se alejan de la cámara. Esto se conoce como nivel de detalle. Los usuarios disponen de controles de representación a nivel de API para ajustar el nivel de detalle, con el fin de maximizar la eficacia del renderizado.
Los objetos de malla progresiva comienzan con un gran número de caras y usan la simplificación para reducir este número. Una malla progresiva que es independiente de la vista se conoce como malla progresiva independiente de la vista (VIPM).
Otra forma de reducir el número de caras es recortar. Esta operación lo que realmente hace es eliminar los vértices y las caras de la malla. El recorte se puede realizar en el extremo superior (para limitar el número máximo de caras) o en el inferior (para limitar el número mínimo de caras). El recorte mejora el rendimiento del dibujo; sin embargo, hay que tener cuidado para que no se pierda la calidad visual. El recorte se muestra en el ejemplo del SDK de Malla progresiva.
En las áreas de alta visibilidad, la resolución se puede aumentar mediante el nivel de detalle progresivo (PLOD). Esta es una técnica para dividir una cara en dos.
Mallas de revisión
También se admiten dos tipos especializados de mallas de revisión: revisiones de rectángulo y de triángulo. La malla de revisión de rectángulo es una malla cuyos puntos de control están dispuestos en una secuencia rectangular de devanado. Las revisiones de rectángulo y triángulo se usan para crear superficies de orden superior. No se usan tan comúnmente como las mallas de triángulo.
Temas relacionados