Fase del sombreador de geometría
La fase del sombreador de geometría (GS) ejecuta código de sombreador especificado por la aplicación con vértices como entrada y puede generar vértices en la salida. A diferencia de los sombreadores de vértices, que operan en un solo vértice, las entradas del sombreador de geometría son los vértices de un primitivo completo (es decir, dos vértices para líneas, tres vértices para triángulos o un solo vértice para un punto) más los datos de vértices para los primitivos adyacentes al borde (es decir, dos vértices adicionales para una línea o tres vértices adicionales para un triángulo). En la ilustración siguiente se muestran ejemplos de primitivos que se escriben en un sombreador de geometría.
Otra entrada para el sombreador de geometría es un identificador primitivo generado automáticamente por el ensamblador de entrada (IA). Un identificador primitivo permite que el sombreador de geometría capture o calcule, si es necesario, los datos por cara.
La fase del sombreador de geometría puede generar varios vértices para formar una sola topología seleccionada. Las topologías de salida de GS disponibles son tristrip, linestrip y pointlist. El número de primitivos que emite un sombreador de geometría puede variar, aunque el número máximo de vértices que un sombreador de geometría puede emitir debe declararse estáticamente. Las longitudes de franja que emite un sombreador de geometría pueden ser arbitrarias (hay un comando cut ).
La salida del sombreador de geometría se puede enviar al rasterizador y a un búfer de vértices en memoria. La salida que se envía a la memoria se expande a listas de puntos, líneas y triángulos individuales (de forma similar a cómo se pasa la salida al rasterizador).
La fase del sombreador de geometría puede implementar los algoritmos siguientes:
Sprite Tessellation point: el sombreador toma un solo vértice y genera cuatro vértices (dos triángulos de salida) que representan las cuatro esquinas de un cuadrángulo con texcoords arbitrarios, normales y otros atributos.
Teselación de línea ancha: el sombreador recibe dos vértices de línea (LV0 y LV1) y genera cuatro vértices para un cuadrángulo que representa una línea ancha. Además, un sombreador de geometría puede usar los vértices de línea adyacentes (AV0 y AV1) para realizar la mitering en puntos de conexión de línea.
Fur/Fin Generation: representación de varios desplazamientos potencialmente con diferentes texturas (caras extruidas) para simular los efectos paralácticos del piel. Las aletas son bordes extruidos que a menudo se desvanezcan si el ángulo no es oblicuo. Las aletas se usan para hacer que los objetos se vean mejor en ángulos oblicuos.
Generación de volumen de sombras: información de adyacencia que se usa para determinar si se va a extruir.
Representación de paso único en varias caras de cubo de textura: los primitivos se proyectan y emiten a un sombreador de píxeles seis veces. Cada primitivo va acompañado de un índice de matriz de destino de representación, que selecciona una cara de cubo.
Configure coordenadas barycéntricas como datos primitivos para que el sombreador de píxeles pueda realizar la interpolación de atributos personalizados.
Un caso patológico: una aplicación genera cierta geometría, después n-parches que geometría y, a continuación, extrue volúmenes de sombra de esa geometría. En estos casos, el paso múltiple es la solución con la capacidad de generar vértices y datos primitivos en un flujo y volver a circular los datos.
Dado que cada llamada al sombreador de geometría puede producir un número variable de salidas, las llamadas paralelas al hardware son más difíciles en esta fase que cuando se ejecutan otras fases de canalización (como fases de sombreador de vértices o píxeles) en paralelo. Aunque las implementaciones de hardware ejecutarán llamadas de sombreador de geometría en paralelo, el almacenamiento en búfer complejo necesario para realizar llamadas de sombreador de geometría paralelas significa que las aplicaciones no deben requerir que el nivel de paralelismo se pueda lograr en la fase del sombreador de geometría tanto como otras fases de canalización. En otras palabras, el sombreador de geometría podría convertirse en un cuello de botella en la canalización en función de la carga del programa que tenga el sombreador de geometría. Sin embargo, el objetivo es que los algoritmos que usan la funcionalidad del sombreador de geometría se ejecuten de forma más eficaz que la aplicación que tiene que emular el comportamiento en el hardware que no puede generar geometría mediante programación.
El tiempo de ejecución de Direct3D llama a las siguientes funciones de controlador para crear, configurar y destruir el sombreador de geometría: