Compartir a través de


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 la capacidad de generar vértices en la salida.

Sombreador de geometría

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 (dos vértices para líneas, tres vértices para triángulos o vértices únicos para el punto). Los sombreadores de geometría también pueden traer los datos de vértices para los primitivos adyacentes de borde como entrada (dos vértices adicionales para una línea, tres adicionales para un triángulo). En la ilustración siguiente se muestra un triángulo y una línea con vértices adyacentes.

ilustración de un triángulo y una línea con vértices adyacentes

Tipo
TV Vértice de triángulo
AV Vértice adyacente
LV Vértice de línea

 

La fase del sombreador de geometría puede consumir el valor generado por el sistema SV_PrimitiveID generado automáticamente por la IA. Esto permite capturar o calcular los datos por primitivo si lo desea.

La fase del sombreador de geometría es capaz de generar varios vértices que forman una sola topología seleccionada (las topologías de salida de la fase GS disponibles son: tristrip, linestrip y pointlist). El número de primitivos emitidos puede variar libremente dentro de cualquier invocación del sombreador de geometría, aunque el número máximo de vértices que se podrían emitir debe declararse estáticamente. Las longitudes de franja emitidas a partir de una invocación del sombreador de geometría pueden ser arbitrarias y se pueden crear nuevas tiras a través de la función HLSL RestartStrip .

La salida del sombreador de geometría se puede alimentar a la fase de rasterizador o a un búfer de vértices en la memoria a través de la fase de salida del flujo. La salida alimentada a la memoria se expande a listas individuales de puntos, líneas y triángulos (exactamente como se pasarían al rasterizador).

Cuando un sombreador de geometría está activo, se invoca una vez para cada primitivo pasado o generado anteriormente en la canalización. Cada invocación del sombreador de geometría ve como entrada los datos de la primitiva invocando, ya sea un único punto, una sola línea o un único triángulo. Una franja de triángulos anterior en la canalización daría lugar a una invocación del sombreador de geometría para cada triángulo individual de la franja (como si la franja se expandiera en una lista de triángulos). Todos los datos de entrada de cada vértice del primitivo individual están disponibles (es decir, 3 vértices para triángulo), además de los datos de vértices adyacentes si procede o están disponibles.

Un sombreador de geometría genera datos de un vértice cada vez anexando vértices a un objeto de flujo de salida. La topología de las secuencias viene determinada por una declaración fija, eligiendo una de las siguientes: PointStream, LineStream o TriangleStream como salida de la fase GS. Hay tres tipos de objetos de secuencia disponibles, PointStream, LineStream y TriangleStream, que son todos objetos con plantilla. La topología de la salida viene determinada por su tipo de objeto respectivo, mientras que el formato de los vértices anexados a la secuencia viene determinado por el tipo de plantilla. La ejecución de una instancia del sombreador de geometría es atómica de otras invocaciones, salvo que los datos agregados a las secuencias son seriales. Las salidas de una invocación determinada de un sombreador de geometría son independientes de otras invocaciones (aunque se respeta el orden). Un sombreador de geometría que genera franjas de triángulos iniciará una nueva franja en cada invocación.

Cuando una salida del sombreador de geometría se identifica como un valor interpretado por el sistema (por ejemplo, SV_RenderTargetArrayIndex o SV_Position), el hardware examina estos datos y realiza algún comportamiento dependiente del valor, además de poder pasar los datos a la siguiente fase del sombreador para la entrada. Cuando dicha salida de datos del sombreador de geometría tiene significado para el hardware por primitiva (como SV_RenderTargetArrayIndex o SV_ViewportArrayIndex), en lugar de por vértice (por ejemplo, SV_ClipDistance[n] o SV_Position), los datos por primitivo se toman del vértice inicial emitido para el primitivo.

El sombreador de geometría podría generar primitivos completados parcialmente si el sombreador de geometría finaliza y el primitivo está incompleto. Los primitivos incompletos se descartan silenciosamente. Esto es similar a la forma en que el IA trata primitivos completados parcialmente.

El sombreador de geometría puede realizar operaciones de muestreo de carga y textura en las que no se requieren derivados del espacio de pantalla (samplelevel, samplecmplevelzero, samplegrad).

Los algoritmos que se pueden implementar en el sombreador de geometría incluyen:

  • Expansión de sprite de punto
  • Sistemas de partículas dinámicas
  • Generación de fur/fin
  • Generación de volumen de sombras
  • Mapa de representación a cubo de paso único
  • Intercambio de materiales de Per-Primitive
  • Per-Primitive configuración de material: incluye la generación de coordenadas barycéntricas como datos primitivos para que un sombreador de píxeles pueda realizar la interpolación de atributos personalizados (para obtener un ejemplo de interpolación normal de orden superior, vea CubeMapGS Sample).

Canalización de gráficos

Fases de canalización (Direct3D 10)