Blog Personal.

Conceptos Básicos

Haciendo bypass a la unidad de Rasterizado

Comentario Original:

Por cierto Urian me parecio ver en su dia un alago de una desarrolladora de Dreams a el chico que salia explicando el video de Unreal5 y este le dijo que se fijaron en ellos (Dreams) a la hora de desarrollar el sistema de pixels y vertices, vamos que Dreams utiliza ya en ps4 parte de esta tecnologia que te permite meter millones de triangulos en un objeto.

 Estaría bien si encuentras info que explicaras como lo hicieron.

 Muchas gracias.

Bueno, para entenderlo has de entender que el pipeline gráfico es como una cadena de montaje donde una vez una parte del pipeline ha terminado lo que hace es enviarlo a la siguiente etapa y tenemos dos tipos de étapas:

  • Las realizadas via función fija.
  • Las realizadas por los Shaders.

En el caso de las de función fija estos son sistemas no programables, realizan siempre las mismas operaciones a partir de unos datos de entrada que si que pueden variar. Debido a que no son programables ocupan muy poco espacio y su rendimiento se puede predecir porque su tasa de trabajo es fija. Los Shaders en cambio son lo que llamamos Compute Units/Shader Machines… (Dependiendo de la arquitectura tienen un nombre u otro), son los encargados de realizar varias de las etapas en el pipeline moderno y son completamente programables, en realidad lo que hacen es aplicar un programa sobre la primitiva gráfica que les va entrando y realizan modificaciones sobre esta.

La idea original con el pipeline de rasterización 3D original (el basado en la OpenGL Machine) es que no habían unidades programables, todo eran una sucesión de unidades de función fija encadenadas que recibían un dato de la anterior y así sucesivamente pero con el tiempo algunas partes del pipeline se volvieron programables y a empezar a realizarse por lo que hoy llamamos Compute Units/Shader Machines pero aún hay partes que son realizadas por unidades de función fija hasta llegar al pipeline actual que es igual en todas las APIs por consenso.

Pues bien, ahora mismo es posible crear tu propio pipeline… ¿Como? Bueno, digamos que no puedes escoger a donde exportan las unidades de función fija pero si que puedes escoger a donde exportan las Compute Units, en todo caso si unimos todos los pipelines 3D históricos para la rasterización nos sale el siguiente diagrama de flujo.

Ahora bien… ¿Que es el Raster Shader? La idea es que en vez de ejecutar el proceso de rasterización en la unidad de rasterizado hacemos que se ejecute en los shaders. Esto lo explique hablando de la tecnología de uso de micropoligonos en Unreal Engine 5 llamada «Nanite» cuando recientemente se presento el motor.

Ahora bien, se ha de tener en cuenta el termino micro-poligono. Las unidades de rasterizado a la hora de convertir los triángulos en fragmentos (grupos de pixeles) tiene un limite en el tamaño de los fragmentos que genera de 16 pixeles (4×4) y cuando termina lo que hace es enviar ese fragmento de 4×4 en 4 fragmentos de 2×2.

¿Pero que ocurre cuando los polígonos son más pequeños? Pues que se transforman en fragmentos de <16 pixeles, pero no por hacer un fragmento de 8 pixeles va a ir el doble de rápido, ni 4 veces más rápido con un fragmento de 4 pixeles. Esto significa que la eficiencia y la velocidad de la unidad de rasterizado, la cual afecta a la parte del texturizado y el Pixel/Fragment Shader en consecuencia pierde su eficiencia cuando trabaja con polígonos muy pequeños.

Cuando en la entrada titulada la Next-Next Gen hable de que la rasterización va a evolucionar a utilizar micropolígonos y que las unidades de función fija van a necesitar cambios profundos me refería a esto ya que la unidad de rasterizado es una unidad de función fija no programable.

Es por ello que la gente de Epic en el caso de Nanite han tenido que buscar un reemplazo de esta funcionalidad en forma de la utilización de Compute Shaders para que la unidad de rasterizado no resulte en un problema para triángulos mucho más pequeños que los que miden 16 pixeles al ser convertidos en fragmentos.

Uno de los cambios a futuro es que el pipeline gráfico ha desaparecido debido a la versatilidad, antes después de invocar ciertas étapas de los Shaders estos invocaban a la función fija que iba después en el pipeline o una unidad de función fija invocaba la siguiente etapa que le correspondía. En la siguiente generación es posible invocar cualquier tipo de Shader y cualquier tipo de unidad de función fija cuando se quiera y sea necesario y no siguiendo un orden marcado como ocurre con el pipeline tradicional y común.

En realidad podemos definir cualquier étapa Shader como un «Compute Shader» en el fondo siendo la única excepcíón a la norma el Fragment/Pixel Shader por lo que puedes crear etapas nuevas en el pipeline pero tienes el handicap con DX12 de que las unidades de función fija solo exportan a la siguiente etapa del pipeline que tienen asignada de manera tradicional, pero a partir de DX12 Ultimate y equivalente (RDNA 2 y Turing hacía adelante) esta limitación ha desaparecido.

Pero para hacer bypass a la unidad de rasterizado no es necesario la API nueva y es posible hacerlo con la tecnología actual, en todo caso a la hora de hacer bypass tienen ventaja las GPUs con mayor capacidad de cálculo en sus Compute Units por motivos obvios. En todo caso esto permite el uso de micropoligonos, que son utilizados tanto en el Dreams de Media Molecule como en la demo técnica de Unreal Engine 5.

Esto es todo, tenéis los comentarios de esta misma entrada para comentar y no olvideis que tenemos Discord.

5 1 vote
Article Rating
1 Comment
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
Snake128

Muchisimas gracias por la explicación, la verdad es que es una pasada.
 
Ganas de ver el video esta noche.

1
0
Would love your thoughts, please comment.x
()
x