¿Pierdo / gano rendimiento para descartar píxeles incluso si no uso pruebas de profundidad?

22

Cuando busqué por primera vez la instrucción de descarte, encontré expertos que dicen que usar descarte resultará en una pérdida de rendimiento. Dijeron que descartar píxeles romperá la capacidad de la GPU de usar zBuffer correctamente porque la GPU primero debe ejecutar el sombreador de fragmentos para ambos objetos para verificar si el más cercano a la cámara se descarta o no. Para un juego 2D en el que estoy trabajando actualmente, he desactivado tanto la prueba de profundidad como la escritura de profundidad. Estoy dibujando todos los objetos ordenados por su profundidad y eso es todo, no es necesario que la GPU haga cosas elegantes. ahora me pregunto si sigue siendo malo si descarto píxeles en mi sombreador de fragmentos.

Ali1S232
fuente

Respuestas:

20

El hardware de gráficos puede realizar una eliminación temprana de fragmentos basada en la profundidad antes de calcular su valor de color (en otras palabras, antes de ejecutar su sombreador de fragmentos). En consecuencia, si utiliza alguna función que afecte eso, como discardla prueba alfa o la manipulación de gl_FragDepthla capacidad del hardware para hacer esa optimización, se verá comprometida, ya que no se puede asumir la verdadera profundidad del fragmento y se debe ejecutar el sombreador completo.

Sin embargo, si el uso de cualquiera de esas características comprometedoras tiene un impacto neto observable en el rendimiento depende de la situación. La optimización temprana-z puede mejorar el rendimiento si tiene sombreadores de fragmentos muy caros, por ejemplo, pero si el costo de su tubería está en el sombreador de vértices (o en otro lugar) no lo beneficiará tanto y, en consecuencia, puede ver poco o sin degradación del rendimiento mediante el uso discard.

Desactivar la prueba de profundidad por completo a través de la API también debería evitar que se ejecute la optimización, ya que podría dar lugar a escenas representadas incorrectamente. En tu caso, entonces, no debería importar que uses discard.

El hardware reciente puede forzar el uso de las pruebas (incluidas las primeras pruebas de plantilla) layout(early_fragment_tests): hay más información (y advertencias) sobre esto en la página que vinculé al comienzo de la respuesta.


fuente
3

Como siempre para las preguntas de rendimiento, la respuesta más precisa es probarlo en su hardware objetivo y medir lo que sucede.

En su caso, probablemente no sea algo malo. De hecho, existe la posibilidad de que ayude al rendimiento al ahorrar en ancho de banda de memoria. Sin embargo, también agregará instrucciones de sombreado, por lo que no siempre es un beneficio de rendimiento.

Incluso cuando se usa el búfer de profundidad, el rendimiento no siempre es muy significativo, si tienes cuidado con el orden en el que dibujas las cosas.

Hay una publicación de blog en https://fgiesen.wordpress.com/2011/07/08/a-trip-through-the-graphics-pipeline-2011-part-7/ que describe con cierto detalle cómo podrían funcionar las pruebas de profundidad tempranas en hardware, y qué limitaciones puede haber.

Adán
fuente
1
En realidad, después de las pruebas, creo que es seguro asumir que no pierdo ni gano rendimiento, pero estaba buscando una respuesta que explicara en profundidad qué y por qué va a suceder.
Ali1S232