Cómo: Diseñar un sombreador de dominio
Un sombreador de dominio es el tercero de tres fases que funcionan conjuntamente para implementar la teselación. El sombreador de dominio genera la geometría de la superficie a partir de los puntos de control transformados desde un sombreador de casco y las coordenadas UV. En este tema se muestra cómo diseñar un sombreador de dominio.
Un sombreador de dominio se invoca una vez para cada punto generado por el teselador de función fija. Las entradas son las coordenadas UV[W] del punto en la revisión, así como todos los datos de salida del sombreador de casco, incluidos los puntos de control y las constantes de revisión. La salida es un vértice definido de la manera que desee. Si la salida se envía al sombreador de píxeles, la salida debe incluir una posición (indicada con una semántica SV_Position).
Para diseñar un sombreador de dominio
Defina el atributo de dominio.
[domain("quad")]
El dominio se define para una revisión cuádruple.
Declare la ubicación en el casco con el valor del sistema de ubicación del dominio .
- Para una revisión cuádruple, use un float2.
- Para una revisión tri, use un float3 (para coordenadas barycéntricas)
- Para una isolínea, use float2.
Por lo tanto, la ubicación del dominio de una revisión cuádruple tiene este aspecto:
float2 UV : SV_DomainLocation
Defina las demás entradas.
Las demás entradas proceden del sombreador de casco y se definen por el usuario. Esto incluye los puntos de control de entrada para la revisión, de los cuales puede haber entre 1 y 32 puntos, y datos constantes de revisión de entrada.
Los puntos de control se definen por el usuario, normalmente con una estructura como esta (definida en How To: Design a Hull Shader):
const OutputPatch<BEZIER_CONTROL_POINT, 16> bezpatch
Los datos de constantes de revisión también se definen por el usuario y pueden tener un aspecto similar al siguiente (definido en How To: Design a Hull Shader):
HS_CONSTANT_DATA_OUTPUT input
Agregue código definido por el usuario para calcular las salidas; esto constituye el cuerpo del sombreador de dominio.
Esta estructura contiene salidas del sombreador de dominio definidas por el usuario.
struct DS_OUTPUT { float3 vNormal : NORMAL; float2 vUV : TEXCOORD; float3 vTangent : TANGENT; float3 vBiTangent : BITANGENT; float4 vPosition : SV_POSITION; };
La función toma cada UV de entrada (del teselador) y evalúa el parche Bezier en esta posición.
[domain("quad")] DS_OUTPUT BezierEvalDS( HS_CONSTANT_DATA_OUTPUT input, float2 UV : SV_DomainLocation, const OutputPatch<BEZIER_CONTROL_POINT, 16> bezpatch ) { DS_OUTPUT Output; // Insert code to compute the output here. return Output; }
La función se invoca una vez para cada punto generado por el teselador de función fija. Dado que en este ejemplo se usa una revisión cuádruple, la ubicación del dominio de entrada (SV_DomainLocation) es float2 (UV); una revisión tri tendría una ubicación de entrada float3 (coordenadas barycéntricas UVW) y una isolínea tendría una ubicación de dominio de entrada float2.
Las demás entradas de la función proceden directamente del sombreador de casco. En este ejemplo, se trata de 16 puntos de control que cada uno es un BEZIER_CONTROL_POINT, así como datos de constantes de revisión (HS_CONSTANT_DATA_OUTPUT). La salida es un vértice que contiene los datos deseados , DS_OUTPUT en este ejemplo.
Después de diseñar un sombreador de dominio, vea Cómo: Crear un sombreador de dominio.
Temas relacionados