Fases de teselación

El entorno de ejecución de Direct3D 11 admite tres nuevas fases que implementan la teselación, que convierte las superficies de subdivisión de bajo detalle en primitivos de mayor detalle en la GPU. Mosaicos de teselación (o divide) superficies de orden alto en estructuras adecuadas para la representación.

Al implementar la teselación en hardware, una canalización de gráficos puede evaluar los modelos de detalles inferiores (recuento de polígonos inferiores) y representarlos con mayor detalle. Aunque la teselación de software se puede realizar, la teselación implementada por hardware puede generar una cantidad increíble de detalles visuales (incluida la compatibilidad con la asignación de desplazamiento) sin agregar los detalles visuales a los tamaños del modelo y paralización de las tasas de actualización.

Ventajas de teselación

Teselación:

  • Ahorra mucha memoria y ancho de banda, lo que permite a una aplicación representar superficies más detalladas a partir de modelos de baja resolución. La técnica de teselación implementada en la canalización direct3D 11 también admite la asignación de desplazamiento, lo que puede producir impresionantes cantidades de detalle de superficie.
  • Admite técnicas de representación escalable, como niveles de detalle dependientes de vista o continuos, que se pueden calcular sobre la marcha.
  • Mejora el rendimiento realizando cálculos costosos con una frecuencia inferior (realizando cálculos en un modelo de detalles inferior). Esto podría incluir la combinación de cálculos mediante formas de mezcla o destinos morfóficos para cálculos realistas de animación o física para la detección de colisiones o la dinámica del cuerpo suave.

La canalización de Direct3D 11 implementa la teselación en hardware, que descarga el trabajo de la CPU a la GPU. Esto puede dar lugar a mejoras de rendimiento muy grandes si una aplicación implementa un gran número de destinos de morfología y/o modelos de deformación o deformación más sofisticados. Para acceder a las nuevas características de teselación, debe obtener información sobre algunas fases de canalización nuevas.

Nuevas fases de canalización

Teselación usa la GPU para calcular una superficie más detallada a partir de una superficie construida a partir de revisiones cuádruples, revisiones de triángulos o isolíneas. Para aproximar la superficie ordenada alta, cada revisión se subdivide en triángulos, puntos o líneas mediante factores de teselación. La canalización de Direct3D 11 implementa la teselación mediante tres nuevas fases de canalización:

  • Fase de sombreador de casco : una fase de sombreador programable que genera una revisión de geometría (y constantes de revisión) que corresponden a cada revisión de entrada (quad, triángulo o línea).
  • Fase de teselador : una fase de canalización de función fija que crea un patrón de muestreo del dominio que representa la revisión de geometría y genera un conjunto de objetos más pequeños (triángulos, puntos o líneas) que conectan estas muestras.
  • Fase del sombreador de dominio: una fase de sombreador programable que calcula la posición del vértice que corresponde a cada ejemplo de dominio.

En el diagrama siguiente se resaltan las nuevas fases de la canalización de Direct3D 11.

diagrama de la canalización direct3d 11 que resalta las fases de sombreador de casco, teselador y sombreador de dominio

En el diagrama siguiente se muestra la progresión a través de las fases de teselación. La progresión comienza con la superficie de subdivisión de bajo detalle. A continuación, la progresión resalta la revisión de entrada con la revisión de geometría, los ejemplos de dominio y los triángulos correspondientes que conectan estos ejemplos. La progresión finalmente resalta los vértices que corresponden a estas muestras.

diagrama de progresión de teselación

fase de Hull-Shader

Un sombreador de casco , que se invoca una vez por revisión, transforma los puntos de control de entrada que definen una superficie de orden bajo en puntos de control que componen una revisión. También realiza algunos cálculos por revisión para proporcionar datos para la fase de teselación y la fase de dominio. En el nivel de caja negra más simple, la fase de sombreador de casco tendría un aspecto similar al diagrama siguiente.

diagrama de la fase del sombreador de casco

Un sombreador de casco se implementa con una función HLSL y tiene las siguientes propiedades:

  • La entrada del sombreador está entre 1 y 32 puntos de control.
  • La salida del sombreador está entre 1 y 32 puntos de control, independientemente del número de factores de teselación. La fase del sombreador de dominio puede consumir la salida de puntos de control de un sombreador de casco. Los datos constantes de revisión pueden ser consumidos por un sombreador de dominio; Los factores de teselación pueden ser consumidos por el sombreador de dominio y la fase de teselación.
  • Los factores de teselación determinan cuánto subdividir cada revisión.
  • El sombreador declara el estado requerido por la fase de teselador. Esto incluye información como el número de puntos de control, el tipo de cara de revisión y el tipo de creación de particiones que se van a usar al teselar. Esta información aparece como declaraciones normalmente en la parte delantera del código del sombreador.
  • Si la fase del sombreador de casco establece cualquier factor de teselación de borde en = 0 o NaN, se seleccionará la revisión. Como resultado, la fase de teselador puede o no ejecutarse, el sombreador de dominio no se ejecutará y no se generará ninguna salida visible para esa revisión.

En un nivel más profundo, un sombreador de casco funciona realmente en dos fases: una fase de punto de control y una fase de constante de revisión, que el hardware ejecuta en paralelo. El compilador HLSL extrae el paralelismo en un sombreador de casco y lo codifica en código de bytes que controla el hardware.

  • La fase de punto de control funciona una vez para cada punto de control, leyendo los puntos de control de una revisión y generando un punto de control de salida (identificado por un ControlPointID).
  • La fase de constante de revisión funciona una vez por revisión para generar factores de teselación perimetral y otras constantes por revisión. Internamente, muchas fases de constante de revisión se pueden ejecutar al mismo tiempo. La fase de constante de revisión tiene acceso de solo lectura a todos los puntos de control de entrada y salida.

Este es un ejemplo de un sombreador de casco:

[patchsize(12)]
[patchconstantfunc(MyPatchConstantFunc)]
MyOutPoint main(uint Id : SV_ControlPointID,
     InputPatch<MyInPoint, 12> InPts)
{
     MyOutPoint result;
     
     ...
     
     result = TransformControlPoint( InPts[Id] );

     return result;
}

Para obtener un ejemplo que crea un sombreador de casco, vea How To: Create a Hull Shader.

Fase de teselador

El teselador es una fase de función fija inicializada enlazando un sombreador de casco a la canalización (vea How To: Initialize the Tessellator Stage). El propósito de la fase de teselador es subdividir un dominio (quad, tri o línea) en muchos objetos más pequeños (triángulos, puntos o líneas). El teselador mosaico un dominio canónico en un sistema de coordenadas normalizado (cero a uno). Por ejemplo, un dominio cuadrático se tesela en un cuadrado de unidad.

El teselador funciona una vez por revisión mediante los factores de teselación (que especifican cómo se teselará el dominio) y el tipo de particionamiento (que especifica el algoritmo usado para segmentar una revisión) que se pasan desde la fase del sombreador de casco. El teselador genera coordenadas uv (y opcionalmente w) y la topología expuesta a la fase del sombreador de dominio.

Internamente, el teselador funciona en dos fases:

  • La primera fase procesa los factores de teselación, solucionando problemas de redondeo, controlando factores muy pequeños, reduciendo y combinando factores, utilizando aritmética de punto flotante de 32 bits.
  • La segunda fase genera listas de puntos o topologías en función del tipo de particionamiento seleccionado. Esta es la tarea principal de la fase de teselador y usa fracciones de 16 bits con aritmética de punto fijo. La aritmética de punto fijo permite la aceleración de hardware a la vez que mantiene una precisión aceptable. Por ejemplo, dada una revisión de 64 metros de ancho, esta precisión puede colocar puntos en una resolución de 2 mm.
Tipo de creación de particiones Intervalo
fractional_odd [1...63]
fractional_even Intervalo de TessFactor: [2..64]
integer Intervalo de TessFactor: [1..64]
pow2 Intervalo de TessFactor: [1..64]

fase de Domain-Shader

Un sombreador de dominio calcula la posición del vértice de un punto subdividido en la revisión de salida. Un sombreador de dominio se ejecuta una vez por punto de salida de fase de teselador y tiene acceso de solo lectura a las coordenadas UV de salida de la fase de teselador, la revisión de salida del sombreador de casco y las constantes de revisión de salida del sombreador de casco, como se muestra en el diagrama siguiente.

diagrama de la fase del sombreador de dominio

Las propiedades del sombreador de dominio incluyen:

  • Se invoca un sombreador de dominio una vez por coordenada de salida de la fase de teselador.
  • Un sombreador de dominio consume puntos de control de salida de la fase del sombreador de casco.
  • Un sombreador de dominio genera la posición de un vértice.
  • Las entradas son las salidas del sombreador de casco, incluidos los puntos de control, los datos constantes de revisión y los factores de teselación. Los factores de teselación pueden incluir los valores utilizados por el teselador de función fija, así como los valores sin procesar (antes de redondear por teselación de enteros, por ejemplo), lo que facilita la geomorfización, por ejemplo.

Una vez completado el sombreador de dominio, la teselación finaliza y los datos de canalización continúan con la siguiente fase de canalización (sombreador de geometría, sombreador de píxeles, etc.). Un sombreador de geometría que espera primitivos con adyacencia (por ejemplo, 6 vértices por triángulo) no es válido cuando la teselación está activa (esto da como resultado un comportamiento indefinido, que la capa de depuración se quejará).

Este es un ejemplo de un sombreador de dominio:

void main( out    MyDSOutput result, 
           float2 myInputUV : SV_DomainPoint, 
           MyDSInput DSInputs,
           OutputPatch<MyOutPoint, 12> ControlPts, 
           MyTessFactors tessFactors)
{
     ...

     result.Position = EvaluateSurfaceUV(ControlPoints, myInputUV);
}

API para inicializar fases de teselación

La teselación se implementa con dos nuevas fases de sombreador programables: un sombreador de casco y un sombreador de dominio. Estas nuevas fases del sombreador se programan con código HLSL definido en el modelo de sombreador 5. Los nuevos destinos de sombreador son: hs_5_0 y ds_5_0. Al igual que todas las fases de sombreador programables, el código del hardware se extrae de los sombreadores compilados pasados al tiempo de ejecución cuando los sombreadores están enlazados a la canalización mediante API como DSSetShader y HSSetShader. Pero en primer lugar, el sombreador debe crearse con api como CreateHullShader y CreateDomainShader.

Habilite la teselación mediante la creación de un sombreador de casco y el enlace a la fase del sombreador de casco (esto configura automáticamente la fase del teselador). Para generar las posiciones finales de vértices a partir de las revisiones teseladas, también deberá crear un sombreador de dominio y enlazarlo a la fase del sombreador de dominio. Una vez habilitada la teselación, la entrada de datos a la fase del ensamblador de entrada debe ser datos de revisión. Es decir, la topología del ensamblador de entrada debe ser una topología constante de revisión de D3D11_PRIMITIVE_TOPOLOGY establecida con IASetPrimitiveTopology.

Para deshabilitar la teselación, establezca el sombreador de casco y el sombreador de dominio en NULL. Ni la fase del sombreador de geometría ni la fase de salida de la secuencia pueden leer los puntos de control de salida del sombreador de casco o los datos de revisión.

Cómo:

La documentación también contiene ejemplos para inicializar las fases de teselación.

Elemento Descripción
Cómo: Crear un sombreador de casco
Cree un sombreador de casco.
Cómo: Diseñar un sombreador de casco
Diseñar un sombreador de casco.
Cómo: Inicializar la fase de teselador
Inicialice la fase de teselación.
Cómo: Crear un sombreador de dominio
Cree un sombreador de dominio.
Cómo: Diseñar un sombreador de dominio
Cree un sombreador de dominio.

Canalización de gráficos