Hice mi parte justa de la programación de juegos en 3D para mi (antiguo) empleador, y también en mis propios motores personalizados para mis propios juegos independientes.
Inicialmente, comencé con Direct3D 9 y D3DX9, que prácticamente hicieron todo por mí y no me obligaron a pensar en términos de sombreadores.
Después de eso, escribí mis primeros sombreadores Direct3D 9, pero usé principalmente un sombreador muy simple para todo lo que hice.
En la iteración más reciente de mi motor de juego, me mudé a Direct3D 11, y con eso creé muchos sombreadores. Realicé el desollado de GPU, partículas calculadas de GPU, mucha iluminación y efectos de procesamiento posterior, todo en la GPU. Cosas realmente geniales.
Hasta ahora solo he usado sombreadores de vértices y píxeles / fragmentos. Aunque todavía hay muchas cosas que aún no he hecho, creo que tengo un conocimiento sólido de lo que hacen los sombreadores de vértices y píxeles / fragmentos, y cómo todo eso encaja en toda la tubería 3D.
Al ponerme al día con los desarrollos más recientes, me he interesado mucho con las nuevas etapas de sombreado. Es decir, el sombreador de geometría, y aún más nuevos, los sombreadores de casco y dominio.
Nunca he usado estas etapas, pero por lo que sé, el sombreador de Geometría, si está habilitado, se ejecuta después del sombreador de vértices, una vez para cada vértice transformado (¿o una vez por primitivo?) Y le permite descartar vértices (¿y primitivos?) , y cree otros nuevos (que supongo que volverán al principio de la tubería).
Supongo que el uso principal del sombreador de geometría sería generar geometría mediante programación en la GPU. Un uso común sería crear quads de cartelera basados en un solo vértice, pero realmente no visualizo muchos otros escenarios comunes aparte de generar fractales y otras cosas que puede generar 100% programáticamente.
En cuanto a los sombreadores Hull y Domain, parece que están relacionados con la teselación (¿creando superficies más lisas a partir de superficies rugosas?), Y deben usarse juntas o no usarse en absoluto. El término "parche" también parece ser común aquí.
¿Alguien querría explicarme, en términos prácticos, para qué sirven estas nuevas etapas de sombreado, cómo encajan en la tubería 3D y en qué casos debería considerar usarlas?
fuente
Respuestas:
Casco y Dominios
Las etapas de sombreador de casco y dominio son parte de la tubería de teselación de la GPU. Por lo general, se usan para calcular geometría de superficie altamente detallada basada en geometría de superficie de entrada de menor detalle, que se define como triángulos o quads (etcétera). Las primitivas de entrada de menor detalle se denominan "parches", y es importante tener en cuenta que pueden no representar la geometría real que eventualmente existirá (aunque podrían). Piense más en los puntos de control de una curva bezier, excepto en una superficie.
El sombreador de casco toma un parche de entrada y produce un parche de salida (o parches; aquí es donde generalmente se produciría la subdivisión del parche). Los metadatos constantes sobre el parche también se pueden calcular dentro del sombreador del casco y la salida para procesar en etapas posteriores de la tubería.
La salida del sombreador de casco se ejecuta a través de una etapa de teselación (función fija) que produce dominios en mosaico normalizados del tipo apropiado (por ejemplo, quads o triángulos).
El sombreador de dominio se ejecuta contra estos dominios para calcular la posición real del vértice de cualquier punto dado en un dominio que resultó de la teselación mencionada anteriormente. El sombreador de dominio genera así una posición de vértice.
La fase de teselación ocurre después de la etapa de sombreado de vértices en la tubería.
Sombreadores de geometría
Los sombreadores de geometría son como sombreadores simplificados de casco / dominio, en cierto modo. Simplemente toman vértices de entrada y producen vértices de salida. Para un vértice de entrada dado, se pueden producir muchos vértices de salida, por lo que se pueden usar para "generar geometría".
La etapa del sombreador de geometría ocurre después del sombreador de vértices y después de la etapa de teselación.
Usos
El sombreador de geometría puede escribir en memorias intermedias de salida de flujo en lugar de ser alimentado directamente a la fase de sombreado de fragmentos y rasterización de la tubería; Esto significa que puede volver a ejecutar la geometría producida por una combinación de una iteración de sombreador de vértice / casco / dominio / geometría a través de la tubería, para realizar un trabajo adicional en otra etapa de sombreador de vértice o lo que sea.
Para lo que puede usar estos es un tema bastante amplio, efectivamente ilimitado, por lo que realmente no intentaré abordarlo. Pero en cuanto a algunas razones motivadoras para considerar su uso ... Lo importante de estas etapas de sombreado es que te permiten obtener muchos detalles adicionales potencialmente sin tener que pagar la memoria o el costo de ancho de banda todo el tiempo. Y también para mover el procesamiento de la CPU a la GPU.
El terreno es un buen ejemplo de dónde es posible que desee utilizar parte de esta tecnología, ya que generalmente necesita verla muy cerca (ya que su personaje está parado sobre ella) y muy lejos (las montañas en la distancia) y poder controlar dónde y cuántos detalles pones en la geometría del terreno "sobre la marcha" a través de estas etapas de sombreado es muy poderoso. Históricamente, las alternativas han sido pagar un costo promedio constante por el terreno en todo momento (un enfoque de mínimo común denominador) o buscar manualmente fragmentos de geometría para diferentes niveles de detalle dentro y fuera de la memoria de la GPU, lo cual es tedioso y costoso.
Cualquier situación similar en la que pueda tener una gama realmente amplia de niveles de detalle que necesita para admitir alguna malla o modelo que también sea razonablemente subdividable también puede ser un candidato para hacer algo inteligente con estos sombreadores. Sin embargo, no todo se traduce bien en la optimización del estilo de superficie de subdivisión . Probablemente podría usarlos también para tela y cabello.
Para leer más, incluyendo muchos más detalles de los que razonablemente puedo recordar o entrar aquí:
fuente