abril 19, 2021

¿Cómo funciona el Variable Rate Shading?

La polémica sobre el VRS es algo que va a colear toda la generación, especialmente por el hecho que PlayStation 5 no dispone de una solución «por hardware». Lo pongo entre comillas porque con «por hardware» se refieren a que una unidad ajena a la que ejecuta los Shaders se encarga de realizar el VRS.

Pero, para entender como funciona hemos de entender que una vez la GPU ha captado lo datos de las texturas, entonces estos se representan de la misma manera en una ola Pixel o Fragment Shader:

Instruccion+píxel, instrucción+píxel, etc.

El VRS en el fondo es un algoritmo de ordenar elementos o sorting, pero un poco particular. Lo que hace es mirar de la siguiente ola o grupo de olas que instrucción+pixel esta repetido dentro de la lista y los unifica en una sola. Esto le permite a la unidad shader dos cosas:

  1. Le permite añadir espacio en el límite de instrucciones por ola y de olas que puede gestionar.
  2. Elimina la redundancia de tener que repetir instrucciones.

La implementación por hardware necesita de dos elementos. Debido a que los Pixel (o Fragment Shaders en Vulkan y otras API) ocurren antes del texturizado y los fragmentos ya contienen punteros a las direcciones de memoria de la VRAM donde se encuentran las texturas. Como es importante ahorrar espacio no vamos a ver, por norma, versiones repetidas de una misma textura aunque la utilicen diferentes polígonos.

Esto se traduce en que podemos añadir en la unidad de rasterizado una unidad de función fija que haga la compresión de datos, pero al mismo tiempo tenemos una exigencia que es la de descomprimir los datos de manera correcta. Para eso es necesario añadir un elemento en los ROPS que es hacía donde envían los datos los Pixel Shaders cuando terminan.

Dicho elemento no es más que una lista, la cual por un lado tiene el pixel de salida de los pixel shaders y por otro lado a que pixeles en pantalla corresponde cada uno. Aquí se ha de aclarar que los ROPS actúan solo a nivel local y de la última ola que había recibido el Pixel Shader, la cual es de 32 elementos, por lo que el VRS se aplicará en esos 32 elementos y no en toda la pantalla. Por lo que no elimina la redundancia al 100%.

Esto es todo, espero que al menos os haya sido instructivo.