HardZone – Así es como la GPU consigue mayor detalle en tus juegos favoritos
Los gráficos en tres dimensiones llevan ya dos décadas entre nosotros y con ello también las GPU encargadas de generarlos y enviarlos a la pantalla de nuestros monitores. A día de hoy son piezas extremadamente complejas que están compuestas por diversos elementos, unos nuevos, otras ya llevan años en el interior. El que trataremos en este artículo es el Geometry Engine.
A medida que los gráficos a tiempo real avanzan también lo hacen las GPU y con ello aparecen nuevos problemas a solucionar o los antiguos se magnifican. Esto se traduce en que las antiguas soluciones dejan de ser eficientes y se han de crear nuevas. La nueva generación de gráficos no solo se va a basar en el Ray Tracing, sino en un aumento considerable de la geometría de la escena. Es aquí donde entra el Geometry Engine, una pieza esencial para mejorar la eficiencia de las GPU en este nuevo paradigma.
Un poco de historia para aclarar confusiones
Históricamente el Geometry Engine o motor de geometría hacía referencia al hardware encargado de realizar los procesos de manipulación de la geometría de la escena que ocurren antes del rasterizado. Es decir, antes de que los triángulos que componen la escena tridimensional se hayan convertido en fragmentos de píxeles.
El primer Geometry Engine fue creación de Jim Clark a principios de los 80, y fue el inicio de la mítica Silicon Graphics. Gracias a dicha innovación fue posible trasladar la manipulación de escenas en 3D de los miniordenadores a estaciones de trabajo que tenían una porción del tamaño y el coste respecto a los primeros.
No fue hasta finales de los 90 que los juegos en 3D empezaron a hacerse populares, pero las primeras tarjetas 3D carecían de Geometry Engine y dependían de la potencia de la CPU para calcular la geometría de la escena. No fue hasta el lanzamiento en PC de la primera NVIDIA GeForce que el GE fue integrado al completo en un chip gráfico. Siendo bautizado como T&L por el marketing de NVIDIA.
Con el paso de los años y la llegada de los Shaders el Geometry Engine como pieza de hardware ha sido reemplazado por completo y ahora son las Unidades Shader quienes se encargan de ello. Este cambio se dio a partir de DirectX 10, momento en que el Geometry Engine como hardware desapareció de las GPU de NVIDIA y AMD, aunque recientemente su significante ha sido tomado por un nuevo tipo de unidad incluida en las arquitecturas más avanzadas y sobre ello es de lo que hablaremos en este artículo.
El Primitive Assembler
Los elementos en una escena en tres dimensiones de los juegos se renderizan utilizando triángulos para componer los diferentes elementos de la escena, los cuales están formados por vértices. Ahora bien, la primera etapa del pipeline gráfico después de que el procesador de comandos haya leído la lista de pantalla es el Vertex Shader y su nombre lo debemos a que lo que hace es trabajar con vértices y no lo hace con primitivas o triángulos de manera independiente.
Es una unidad llamada Primitive Assembler la encargada de unir esos vértices, no solo para crear triángulos, sino de reconstruir los diferentes modelos que componen la escena uniendo sus diferentes vértices entre sí. El Primitive Assembler es una pieza de función fija en todas las GPUs que realizan esta función de manera automática sin necesidad de la participación del código en la lista de pantalla. Simple y llanamente todo lo que se ejecuta en la etapa del Vertex Shader dentro del pipeline 3D es enviado al Primitive Assembler y de ahí al siguiente proceso de la etapa.
En el caso de que exista una unidad de teselación en la GPU, la cual se encargan de subdividir los vértices, el Primitive Assembler se ejecuta justo después del proceso de teselación, ya que la nueva configuración de los vértices requiere cálculos de unión distintos de los vértices que compondrán los diferentes elementos de la escena.
El Clipper y la eliminación de geometría superflua
En una escena en tres dimensiones hay una gran cantidad de primitivas gráficas o triángulos en la escena. No obstante, no todos son visibles por el jugador en cada fotograma y por ello es necesario descartar en cada fotograma toda la geometría no visible antes de la etapa de rasterizado. Ya que todo vértice que no se vea, pero que no sea descartado es uno que será posteriormente rasterizado, texturizado e incluso si después es descartado por existir otro píxel con mayor prioridad a la hora de dibujarse.
¿El motivo? Hay que tener en cuenta que dentro del pipeline 3D tradicional se ejecuta un Vertex Shader por cada vértice en la escena, pero un Pixel Shader por cada vértice y la cantidad de píxeles por triángulo suele ser una orden de magnitud mayor. Por eso es importante descartar la geometría no visible en la escena. Para ello se utilizan dos algoritmos:
El primero detecta los vértices fuera del campo de visión del jugador y es llamado View Frustum Culling.
El segundo en cambio elimina aquellos que sí que se encuentran dentro del campo de visión, pero que se encuentran ocultos por otros elementos más grandes y más cercanos y es llamado Back Face Culling.
Ahora bien, el proceso de Culling puede ser realizado también a través de función fija y lo que hace es eliminar por completo los triángulos e incluso objetos no visibles. Pero, ¿qué ocurre cuando un objeto es parcialmente visible? Pues dependiendo de cómo esté implementado el hardware no lo elimina o elimina el objeto por completo.
¿Qué es el Geometry Engine en una GPU actual?
Una vez explicados los problemas en el Primitive Assembler y en Clipper hemos de hablar de lo que es el Geometry Engine, el cual no es más que una nueva pieza de hardware que reúne las mismas capacidades que el Primitive Assembler y el Clipper, pero con una mayor precisión. Ya que tiene la capacidad de eliminar la geometría superflua pero a nivel de vértices. Esto significa que si un objeto está parcialmente fuera de pantalla o no totalmente oculto, lo que hace es eliminar los vértices no visibles y reconstruir solo la parte visible.
La otra utilidad del Geometry Engine tiene que ver con la creación en el nivel de detalle de los objetos en la escena, donde estos tienen diversos niveles de detalles, Levels of Detail o LOD en inglés, según la distancia. El Geometry Engine tiene la capacidad de eliminar los vértices no visibles de forma inteligente según la distancia y por tanto conservar la forma original del objeto. Pensad en ello como una teselación a la inversa, donde en vez de aumentar la cantidad de vértices para generar detalle, lo que se hace es disminuirlos.
Esto es importante también de cara al problema de la sobreteselación, hay que tener en cuenta que cuando se realiza la teselación de los vértices la GPU no tiene constancia de su posición real en el espacio del fotograma por lo que acaba ocurriendo un problema que es la sobreteselación. El cual consiste en que la GPU calcula vértices de más en objetos en la lejanía que no se ven, pero cuyos datos están ahí. El Geometry Engine al tener acceso a la información de la geometría de la escena los puede eliminar fácilmente. No olvidemos que el Clipper tradicional solo elimina aquello que está fuera de escena u oculto.
El Geometry Engine en el nuevo pipeline de DX12 Ultimate
Con DirectX 12 Ultimate la parte del pipeline 3D antes del rasterizado cambia por completo, ya que buena parte de las funciones pasan de realizarse a través de función fija a hacerlo en las unidades Shader de la GPU. Por ejemplo la teselación llegará un punto que dejará de realizarse en una unidad de función fija para pasar a dichas unidades y por tanto dicha unidad desaparecerá.
En el caso del Geometry Engine este no desaparecerá, pero es el único que tiene acceso a la información de cómo están conectados los vértices entre sí. Cualquier algoritmo que implique el acceso a la lista de la geometría de la escena supone tener que pasar por el Geometry Engine que es el que controla la lista de vértices y sus relaciones entre sí.
De cara al futuro, una de las cosas que vamos a ver será la creación de estructuras BVH para el Ray Tracing desde la GPU, la pieza del hardware que harán evolucionar para dicha tarea es el Geometry Engine. El cual ya a día de hoy tiene acceso a la caché L2 de la GPU, donde se almacena la información de los vértices de manera temporal. Se espera que en los años siguientes la cantidad de memoria dentro de la GPU aumente de manera considerable.
The post Así es como la GPU consigue mayor detalle en tus juegos favoritos appeared first on HardZone.