triangle texture stb_image normalized learnopengl example architecture glsl shader

architecture - stb_image - texture in opengl c++



GLSL multiple shaderprogram VS uniforms switches (3)

En los dispositivos móviles, la bifurcación en un sombreador aumenta mucho el tiempo de renderización. Debe hacer algunas mediciones sobre el tiempo para cambiar de programa frente a la tasa de extracción reducida asociada con la bifurcación en una operación de repetición por vértice / por téxel. Recomendaría el método n. ° 1 y vería cómo se configura GPUImage para una buena arquitectura de sombreado amigable.

https://github.com/BradLarson/GPUImage

Estoy trabajando en una arquitectura de administrador de sombreadores y tengo varias preguntas para personas más avanzadas. Mi elección actual se opone a dos diseños que son:


1. Por programa de sombreador de materiales

=> Crear un programa de sombreado por material utilizado en el programa.

Contras potenciales:

  • Teniendo en cuenta que cada objeto puede tener su propio material, implica una gran cantidad de llamadas glUseProgram.
  • Implica la creación de muchos objetos de shaderprogram.
  • Arquitectura más compleja que # 2.

Pros:

  • El código de sombreado se puede generar específicamente para cada "opción" utilizada en el material.
  • Si no me equivoco, los uniformes deben establecerse solo una vez (cuando se crea el programa shader).


2. Programas globales de sombreado

=> Cree un programa de sombreado por función de sombreado (iluminación, reflexión, mapeo de paralaje ...) y utilice las variables de configuración para habilitar o descartar las opciones dependiendo del material a renderizar.

Contras potenciales:

  • Los uniformes deben cambiarse muchas veces por cuadro.

Pros:

  • Los programas de sombreado inferior cuentan.
  • Menos SP swich (glUseProgram).


Es posible que note que mi tendencia actual es # 1, pero quería saber su opinión al respecto.

  • ¿El ajuste inicial de uniformes compensa la sobrecarga de llamada glUseProgram (no soy especialmente fanático de la velocidad)?
  • En el caso n. ° 1, para cualquier consideración de memoria o rendimiento, ¿debo llamar glLinkProgram solo una vez cuando creo el SP, o debo desvincular / vincular cada vez que llamo a glUseProgram?
  • ¿Hay mejores soluciones?

¡Gracias!


Realmente depende de su hardware y de las demandas específicas de su aplicación.

Otra desventaja del n. ° 2 es que tu sombreador generalmente no es tan eficiente porque tiene que hacer una bifurcación condicional basada en los uniformes que ingresas. Así que básicamente estás intercambiando entre menos tiempo de cambio de estado y menor rendimiento en tu sombreador . Depende de cuál sea peor.

Definitivamente solo deberías llamar a glLinkProgram una vez por shader. Compilar un sombreador lleva mucho más tiempo que cambiar los sombreadores ya compilados.

Realmente no hay mejores soluciones. Prácticamente todo el mundo que escribe un motor de renderizado tiene que tomar la decisión que se le presenta.


Veamos el # 1:

Teniendo en cuenta que cada objeto puede tener su propio material, implica una gran cantidad de llamadas glUseProgram.

Esto no es tan importante, de verdad. El intercambio de programas es difícil, pero también estaría intercambiando texturas, por lo que no es como si ya no estuviese cambiando un estado importante.

Implica la creación de muchos objetos de shaderprogram.

Esto va a doler. De hecho, el principal problema con el n. ° 1 es la combinación explosiva de sombreadores. Si bien ARB_separate_program_objects ayudará, todavía significa que tiene que escribir muchos sombreadores o crear una forma de no escribir muchos sombreadores.

O puede usar la representación diferida , lo que ayuda a mitigar esto. Entre sus muchas ventajas es que separa la generación de los datos del material de los cálculos que transforman estos datos de material en reflectancia de la luz (colores). Debido a eso, tiene muchos menos sombreadores para trabajar. Tiene un conjunto de sombreadores que produce datos de materiales y un conjunto que utiliza los datos de materiales para realizar cálculos de iluminación.

Entonces, yo diría usar # 1 con renderizado diferido.