Compartir a través de


Uso de UVAtlas (Direct3D 9)

Nota

UVAtlas se envió originalmente en la biblioteca de utilidades D3DX9 en desuso. La versión más reciente está disponible en UV Atlas Command-Line Tool (uvatlas.exe) .

Muchas técnicas de representación y generación de contenido requieren un mapa único y no superpuesto de una señal 2D (como una textura) en una malla. Estas técnicas incluyen:

  • Asignación de desplazamiento o normal
  • Simulaciones de PRT de espacio de textura y mapas de luz
  • Pintura de superficie
  • Iluminación de espacio de textura

La generación de una asignación UV única manualmente suele llevar mucho tiempo y tediosa; esto es especialmente cierto cuando la geometría de entrada es compleja y se desea un uso eficaz y eficaz del espacio de textura de distorsión baja. En la ilustración siguiente se muestra una malla de ejemplo y su atlas de textura correspondiente.

Muestra una malla de ejemplo y su atlas de textura correspondiente.

En este ejemplo se muestra una malla (a la izquierda) y el mapa normal de espacio UV correspondiente (a la derecha). Observe que el atlas de textura contiene varios grupos o clústeres de datos; cada clúster se denomina gráfico y, en el ejemplo anterior, muestra que contiene los datos normales de una parte de la malla.

Las API UVAtlas D3DX generan automáticamente un atlas de textura óptimo y no superpuesto. Las API proporcionan parámetros de entrada que le permiten:

  • Minimice el ajuste, la distorsión y el muestreo de texturas.
  • Maximice la densidad de empaquetado de espacio de textura para un uso eficaz de la memoria.
  • Proporcione un muestreo uniforme en la malla, lo que minimiza las discontinuidades en la frecuencia de muestreo.

Funcionamiento de UVAtlas

Las API UVAtlas (consulte Funciones UVAtlas) generan un atlas de textura mediante la creación de particiones de una superficie en gráficos y el empaquetado de los gráficos en un atlas de texturas. Use D3DXUVAtlasPartition y D3DXUVAtlasPack para realizar estos pasos por separado; o use D3DXUVAtlasCreate para crear particiones, parametrizar y empaquetar en una sola llamada.

Creación de particiones y parametrización de una malla

En primer lugar, la malla se divide en gráficos y, a continuación, cada gráfico se parametriza en su propio espacio UV [0,1]. Un cilindro puede ser parametrizado por un gráfico; Por otro lado, una esfera requerirá dos gráficos, como se muestra en la ilustración siguiente.

ilustración de una esfera particionada en dos gráficos

Una malla que se puede parametrizar con un único gráfico se clasifica como "homeórfica en un disco", lo que significa que podría distribuir un disco infinitamente flexible y extensible sobre el gráfico y cubrir perfectamente la geometría. Este extendido, denominado homeomorfismo, es una función bidireccional; lo que significa que puede pasar de una parametrización a la otra sin perder información.

Muy pocas mallas reales se pueden parametrizar en dos dimensiones sin separar la malla en clústeres o gráficos. En la ilustración siguiente se muestra otra malla de ejemplo y su atlas de textura correspondiente.

Muestra una malla de ejemplo con diferentes formas y su atlas de textura correspondiente.

Hay dos parámetros que determinan el número de gráficos creados:

  • Número máximo de gráficos permitidos para el atlas
  • Cantidad máxima de stretch permitida para cada gráfico

La cantidad de stretch determinará el número de gráficos que se generan y la calidad general del muestreo. Los intervalos de 0,0 (sin estirar) a 1,0 (cualquier cantidad de stretch). D3DXUVAtlasCreate y D3DXUVAtlasPartition devuelven la extensión máxima generada por el algoritmo. En la ilustración siguiente se muestra otra malla de ejemplo y su atlas de textura correspondiente.

ilustración de una malla de ejemplo y su atlas de textura correspondiente

Uso de tensores de métricas integrados para controlar la parametrización

La priorización del espacio de textura se puede especificar por triángulo. Se pueden proporcionar tensores de métricas integrados para controlar cómo se estiran los triángulos en el atlas resultante del espacio de textura. Las IMT se pueden especificar directamente o calcular en función de una señal de entrada mediante las funciones de cálculo de IMT D3DX. Un tensor de métrica integrado (o IMT) es una matriz simétrica de 2x2 que describe cómo se estira un triángulo en el atlas. Cada IMT se define mediante 3 floats, llámalos (a,b,c). Se pueden organizar en una matriz simétrica de 2x2 como esta:

a b
b c

A continuación, se puede usar el IMT para encontrar la distancia entre dos vectores. Dados dos vectores v1 y v2, donde :

vector v1
vector v2 = v1 + (s,t)

La distancia entre v1 y v2 se puede calcular como:

sqrt((s, t) * M * (s, t)^T)

En otras palabras, el vector (s,t) podría ser la magnitud del tramo en una dirección arbitraria en el espacio u-v. En este caso, el vector s es una dirección del primer al segundo vértice, y t es el producto cruzado de los valores normales y s. Por ejemplo:

(1,1) * (1,1) = (2,2)
        (1,1)
IMT(1,1,1) scales by 2
(1,-1) * (1,1) = (0,0)
         (1,1)
IMT(2,0,2) scales by 2 with no shearing

Las IMT se pueden especificar directamente o calcular en función de una señal de entrada mediante las funciones de cálculo de IMT D3DX: D3DXComputeIMTFromPerVertexSignal, D3DXComputeIMTFromPerTexelSignal, D3DXComputeIMTFromSignal y D3DXComputeIMTFromTexture_graphics.

Especifique los datos de IMT directamente si desea controlar cómo se asigna el espacio de textura a triángulos individuales. Al hacerlo, asigne más área en el atlas a áreas importantes de una malla (como la cara o el logotipo del pecho de un personaje, o las regiones de una escena cerca del sendero de un jugador). Al especificar IMT que son múltiplo de la matriz de identidades, los triángulos resultantes se escalarán uniformemente en el espacio de textura.

Por ejemplo, dado un mapa normal de alta resolución, puede calcular IMT para proporcionar más espacio de textura a áreas de señal de frecuencia más alta en el mapa normal. Los triángulos que son "planos" (que se asignan a regiones constantes del mapa normal original) recibirán menos espacio de textura. Los triángulos que contienen una gran cantidad de detalles de mapa normal recibirán más área de textura en el resultado final. A continuación, puede volver a implementar el mapa normal en una textura más pequeña, pero mantener los detalles, o puede volver a calcular el mapa normal con la asignación uv más óptima.

Usar datos de adyacencia para creases especificados por el usuario

La información de adyacencia definida por el usuario se puede proporcionar a la función de creación de particiones para describir creaciones predefinidas en la malla y, por tanto, definir un límite de gráfico entre caras adyacentes. Se trata de una manera sencilla para que el autor de la llamada especifique su propia creación de particiones de gráfico como entrada en el algoritmo, lo que refinará aún más los gráficos para ajustar el ajuste bajo el máximo permitido.

Ejemplo

En este ejemplo se muestra cómo puede usar las API UVAtlas y el Visor de DirectX (Dxviewer.exe) para buscar y corregir las discontinuidades del modelo que pueden afectar drásticamente al tamaño del atlas de texturas. Puede obtener Dxviewer.exe y obtener información sobre ella desde el SDK de DirectX. Dxviewer.exe se quitó del SDK de DirectX después de la versión de agosto de 2009 para obtenerla, necesitará al menos el SDK de DirectX de agosto de 2009. Para obtener información sobre el SDK de DirectX, consulte ¿Dónde está el SDK de DirectX?.

Supongamos que ha empezado con algún modelo en el software de generación de contenido favorito (en este ejemplo se usa un modelo principal enano creado en Maya). Exporte el modelo con textura a un archivo .x y cree un atlas de texturas con D3DXUVAtlasCreate. El atlas de textura resultante tendría un aspecto similar a la ilustración siguiente.

ilustración de un atlas para un modelo enano

El atlas tiene 22 gráficos y un tramo máximo de 0,994.

Ahora examine el modelo con textura para ver cómo se asigna el atlas de texturas a la geometría. Para ello, cargue el modelo en la herramienta visor:

  • Abra la herramienta visor desde las utilidades de DirectX.
  • Cargue el archivo .x haciendo clic en el botón Abrir.
  • Para habilitar la opción de visualización de creación, haga clic en el botón ver y seleccione Creases en el menú emergente.

En la ilustración siguiente se muestra lo que debería ver en la herramienta visor.

ilustración de una malla con textura en la herramienta visor

Cada línea es un pliegue que es un borde adyacente entre dos gráficos en el atlas de texturas. El número de gráficos generados por el algoritmo se debe a pequeñas diferencias quizás debido a las discontinuidades en los normales. Estas pequeñas diferencias se pueden reducir mediante la soldadura de datos, es decir, forzar los datos que son casi iguales a ser iguales. Para soldar los normales y los pesos de piel:

  • Ejecute la herramienta DirectX Ops (dxops.exe) con la siguiente línea de comandos en la malla (reemplazando "modelName.x" por el nombre del modelo):
    Dxops.exe -s "load 'modelName.x'; Optimize n:2.01 w:2.01 uv0:0.01;  save 'newModelName.x';"
    

Esto compara los valores normales y los pesos de la piel, y en los que difieren en el valor en menos de 2,01, los datos se convierten en iguales. En las ilustraciones siguientes se muestra un primer plano del ojo para ver los pliegues antes de la soldadura (a la izquierda) y los pliegues después de la soldadura (a la derecha):

ilustración de pliegues antes de la ilustración de soldadura de pliegues después de la soldadura

Figura 7: Eliminación de pliegues mediante soldadura

En este ejemplo, la soldadura quitó 86 vértices de la malla de entrada. Con menos pliegues en la malla, puede regenerar el atlas, como se muestra en la ilustración siguiente.

ilustración del nuevo atlas con creas quitados

El atlas solo tiene 7 gráficos y un tramo máximo de aproximadamente 0,0776. El nuevo atlas ahora encaja en una textura más pequeña (aproximadamente un 30 % más pequeña en este ejemplo).

Empaquetar gráficos en un Atlas

Una vez que una malla se ha particionado en gráficos parametrizados individualmente, los gráficos deben empaquetarse de forma eficaz en un único mapa de textura. Esto se realiza como segundo paso de D3DXUVAtlasCreate o se puede invocar explícitamente llamando a D3DXUVAtlasPack.

Los gráficos empaquetados están separados por un ancho de canalón especificado por el usuario. El ancho del medianil es la cantidad de separación entre los gráficos y permite la interpolación bilineal y la asignación mip para evitar la representación de artefactos en los límites del gráfico. D3DX proporciona una interfaz para rellenar automáticamente estos medianiles; consulte ID3DXTextureGutterHelper para obtener más información.

Integración de UVAtlas en la canalización

Además de ser invocado por el artista antes de la pintura de texturas, estas funciones se pueden integrar en una canalización de arte automatizada. Por ejemplo, una llamada a UVAtlas se puede emitir automáticamente después de actualizar un recurso, antes de realizar una simulación PRT o un pase de asignación normal. Esto evita cualquier necesidad de reparar manualmente la asignación UV de un objeto si se ha modificado la topología de la malla.

Consulte la Herramienta de Command-Line UV Atlas (uvatlas.exe) para obtener un ejemplo de uso de las funciones UVAtlas.

Temas avanzados