2012-03-13 14 views
6

¿Qué tan rápido es glUseProgram()? ¿Hay algo mejor (más rápido) ?:Comportamiento de uniformes después de glUseProgram() y velocidad

Aquí están mis pensamientos:

  1. Uso 1 programa de sombreado universal, pero con muchos ajustes de entrada y atributos (ajustes para cada clase de gráficos)
  2. utilizar más de 1 sombreado para cada clase de gráficos

¿En qué estado están uniformes después de cambiar el programa de sombreado? ¿Guardan valores (por ejemplo, valores de matrices)?

Éstos son lo que considero los beneficios de # 1 para ser:

  • No usa glUseProgram()

Y los beneficios de # 2:

  • n cambios en la matriz (por ejemplo, si la clase Menu y la clase Scene3D tienen diferentes matrices de proyección)

Respuesta

6

Cuál de las dos opciones es mejor depende en gran medida de qué hacen esos sombreadores, qué tan diferentes son y cuántos atributos/uniformes establece y con qué frecuencia se cambian. No hay una respuesta correcta para todos los casos.

Dicho esto: tenga en cuenta que no solo existe el costo por cambios de estado, sino también un costo de tiempo de ejecución de sombreado y se paga por vértice y por fragmento. Por lo tanto, mantener la complejidad del sombreado siempre es una buena idea, y un sombreador universal es más complejo que uno especializado.

Minimice el cambio de estado. Si tiene los objetos A, C, E usando el Programa X y B, D, F usando el Programa Y, entonces, todo lo demás es igual, renderice en orden ACEBDF, no ABCDEF.

En relación con la última pregunta: Los programas conservan su estado y, por lo tanto, los valores de los uniformes, a lo largo de su vida, a menos que los vuelvas a vincular. Pero los uniformes son por estado de programa, lo que significa que si tiene dos uniformes con el mismo nombre y tipo en diferentes programas, los valores no se transferirán de un programa a otro.

+0

"Cuál de las dos opciones es mejor depende en gran medida de lo que hacen los sombreadores" - La tarea es simple - la representación con texturación, sin ningún efecto (solo algunos deben tener efectos de sombreado). –

+0

Si algunos son muy simples y algunos tienen un efecto, entonces tendría un sombreador simple con texturas (suponiendo openg gl 2.xo superior) y uno por clase de efecto. Pero realmente es difícil juzgar sin saber más. Probablemente no importará mucho en el panorama general. A menos que tenga problemas de rendimiento y sepa que se debe a cambios de estado, simplemente haga lo que le resulte más conveniente. – haffax

+1

Los uniformes se pueden compartir entre programas usando el Objeto Buffer Uniforme (consulte, por ejemplo, [Uniformes Compartidos] (http://arcsynthesis.org/gltut/Positioning/Tut07%20Shared%20Uniforms.html)) – stativ

Cuestiones relacionadas