¿Cuál es el compromiso de rendimiento entre el renderizado hacia adelante y diferido?

9

El renderizado hacia adelante es el proceso de calcular un valor de radiancia para un fragmento de superficie directamente desde la geometría de entrada y la información de iluminación. La representación diferida divide ese proceso en dos pasos: primero, producir un búfer en el espacio de la pantalla que contiene las propiedades del material (un búfer de geometría o búfer G) creado al rasterizar la geometría de entrada, y segundo, producir un valor de resplandor para cada píxel combinando el G- tampón con información de iluminación.

El renderizado diferido a menudo se presenta como una optimización del renderizado hacia adelante. Una explicación es que la iluminación es bastante costosa y si tiene algún sobregiro, está iluminando píxeles que nunca se verán en la pantalla, mientras que si almacena las propiedades del material en un G-buffer y la luz después, solo está iluminando un píxel que En realidad aparece en la pantalla. ¿Es esto realmente una ventaja de diferido, dado que también puede hacer un pase previo de profundidad y luego hacer un pase de renderizado directo con una prueba de profundidad establecida en D3D11_COMPARISON_EQUALo GL_EQUALequivalente?

El renderizado diferido también tiene el potencial de programar mejor en la GPU. La división de un frente de onda / urdimbre grande en un frente de onda de geometría más pequeña y luego frentes de onda de iluminación más pequeños luego mejora la ocupación (más frentes de onda en vuelo simultáneamente). Pero también terminas con mucho más uso de ancho de banda (escribiendo una gran cantidad de canales en el G-buffer, luego volviéndolos a leer durante la iluminación). Obviamente, los detalles aquí dependen mucho de su GPU, pero ¿cuáles son los principios generales?

¿Hay otras consideraciones prácticas de rendimiento al decidir entre renderizado directo y diferido? (Suponga que podemos usar variaciones de cada técnica si es necesario: es decir, también podemos comparar mosaico adelante con mosaico diferido).

John Calsbeek
fuente

Respuestas:

11

Es posible evitar el sobregiro de los objetos opacos incluso con el renderizado hacia adelante haciendo un paso previo de profundidad y utilizando esa información para rechazar cualquier píxel que no sea realmente visible. Sin embargo, dependiendo del costo de vértice de su escena, una pasada previa de profundidad puede agregar una cantidad inaceptable de sobrecarga de rendimiento. Además, renderizar utilizando la canalización de sombreado de píxeles de la GPU significa que no paga un costo por píxel que se procesa, sino un costo por quad de 2x2 píxeles que se procesa. Por lo tanto, incluso hacer un paso previo de profundidad aún hace que los bordes de los triángulos desperdicien píxeles de sombreado de trabajo que se descartarán.

La programación de GPU es un tema complejo, y la compensación entre reenvío y diferido no se reduce simplemente a "se ejecuta más rápido sino que usa más ancho de banda". Si tiene dos operaciones igualmente baratas que se ejecutan en secuencia y cada una usa la misma cantidad de recursos, no hay razón para dividirlas en sombreadores separados: dos frentes de onda pequeños que usan recursos X no funcionan fundamentalmente mejor que un solo frente de onda más largo que También usa X recursos. Sin embargo, si tiene una operación barata y una operación costosa para ejecutar en secuencia, puede ser beneficioso dividirse en sombreadores separados: el sombreador en general reservará la cantidad máxima de recursos que podría usar en cualquier momento. Eso' Es concebible que el renderizado hacia adelante no pueda usar todo el ancho de banda de su GPU porque hay tan pocos frentes de onda en vuelo que no puede emitir suficientes operaciones para saturar el ancho de banda. Pero si tutienen un ancho de banda limitado, puede que no haya ninguna ventaja en el renderizado diferido (ya que probablemente usará más ancho de banda).

Una preocupación de rendimiento adicional es que el renderizado hacia adelante admite diferentes tipos de material (diferentes BRDF, por ejemplo) simplemente usando un sombreador diferente para ese objeto. Un renderizador diferido directo necesita manejar diferentes tipos de material de una manera diferente (potencialmente una rama en el sombreador), ya que el trabajo ya no se agrupa en deformaciones / frentes de onda de manera coherente dependiendo del objeto que se está renderizando. Esto puede mitigarse con un renderizador de mosaico: si solo áreas específicas de la pantalla usan un tipo de material alternativo (por ejemplo, para el cabello), entonces puede usar la variación del sombreador con una rama de tipo de material solo para los mosaicos que contienen píxeles con ese material .

John Calsbeek
fuente