Blog Personal.

Uncategorized

PS5 y XSX: Primitive/Mesh Shaders

Se considera la parte geométrica del pipeline a las etapas que ocurren antes del rasterizado, la cual en DX12 y Vulkan esta compuesta por muchas etapas.

Las etapas marcadas en azul son las de función fija, las etapas marcadas en verde son las que ocurren en los Shaders. Cuando una etapa termina su resultado es enviado para ser la entrada de la siguiente etapa. Ahora bien, si nos fijamos del Vertex Shader pasamos al Hull Shader y del Domain Shader al Geometry Shader… ¿Acaso no se pueden unificar ambas partes en un nuevo tipo de Shader? Pues si y esto es lo que se busca con los Primitive/Mesh Shaders.

Pero para entender el problema lo mejor es el siguiente GIF.

Cuando una etapa termina en la pieza del hardware correspondiente envia el resultado a la siguiente, esto tiene sentido si hablamos de una Compute Unit a una unidad de función fija pero es un sinsentido si hablamos de Compute Unit a Compute Unit.

La idea es reducir el número de etapas haciendo uso de un shader más genérico para todas ellas. El caso es que el único shader especial para gráficos es el Pixel/Fragment Shader que no se encuentra en esta etapa y en realidad podemos utilizar un Compute Shader que es completamente genérico para cualquiera de las etapas de la geometría e incluso unificar varias de ellas.

Pero existe un elemento de función fija en la etapa geometrica que es el de la teselación o subdivisión de superficies, al hacerse vía función fija la tasa de teselado es fija y por tanto la cantidad de primitivas via teselación que terminan en las etapas siguientes se ve limitada por ese factor. Con el uso de los Mesh/Primitive Shaders todas las etapas quedan unificadas en una incluyendo la teselación en forma de un enorme Compute Shader por lo que los desarrolladores tienen la opción de prescindir de la misma.

No obstante los desarrolladores pueden utilizar unidades de función fija para la teselación y para el culling de primitivas si es necesario. El desarrollador tiene total libertad para decidir como se desarrolla el pipeline geométrico, puede eliminar etapas del pipeline tradicional y crear otras de nuevas en el proceso. Puede tirar de las unidades de Culling y/o Teselación o prescindir por completo de ellas si el juego no lo necesita.

Una de las funciones que permite esto es el llamado Pre-Culling, este consiste en renderizar la geometría de la escena pero sin aplicar los shaders correspondientes, solo las clásicas matrices de transformación para saber donde esta cada objeto, luego eliminar por completo de la lista de objetos a calcular los siguientes:

  • Elementos demasiado pequeños o demasiado lejanos para verse.
  • Elementos que se ven opacados por otros más grandes.
  • Elementos fuera de cámara.

La etapa de Pre-Culling no renderiza nada pero da una lista de objetos a eliminar en ese fotograma que la unidad de Culling (Geometry Engine) se encargara de eliminar por completo. Luego renderiza normal pero sin tener en cuenta esos elementos que por una razón u otra no tiene sentido que se rendericen en etapas posteriores.

Una de las aplicaciones más claras es la teselación adaptativa… ¿En que consiste? En que la teselación se aplica más o menos según la distancia en la cámara. Combinarlo con el Culling que os he comentado y se gana mucho rendimiento eliminando geometría superflua en el fotograma. Pero sobretodo permite cargar la potencia de la geometría en los primeros planos de la cámara y no malgastarla en los planos posteriores de la cámara. La teselación adaptativa no se puede aplicar con un teselador de función fija porque este hace la subdivision de primitivas a lo bruto sin tener en cuenta esos detalles.

Esto es completamente estándar y completamente independiente del fabricante, en PC los primeros en comercializarlo han sido los de Nvidia con Turing (gama RTX 20×0) y lo veremos en consolas de siguiente generación. El video que veis es un ejemplo de la útilidad a nivel práctico.

Esto además permite reducir los tiempos de desarrollo, ya que te olvidas de tener que realizar varios modelados con diferentes niveles de detalle. Esto ve en la demo Asteroids de Nvidia donde los asteroides más lejanos son creados recortando geometria de los más cercanos de manera dinámica.

Esto es todo, tenéis el Discord y los comentarios de esta entrada para comentarla.

0 0 vote
Article Rating
1 Comment
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
UnPerreoDuro

Saca ya la entrada sobre la Ps5 que ya no aguanto la espera