Organización de shaders GLSL en el motor OpenGL


¿cuál es mejor ?

  1. Para tener un programa de sombreado con muchos uniformes especificando luces para usar, o asignaciones para hacer(por ejemplo, necesito una malla para ser mapeado paralaje, y otro paralaje / especular mapeado). Haría una lista en caché de uniformes para transferencias perezosas, y simplemente cambiaría un par de uniformes para cada malla siguiente si es necesario hacerlo.

  2. Para tener una gran cantidad de programas de sombreado para cada caso necesario, cada uno con una pequeña cantidad de uniformes, y hacer el lazy bind con glUseProgram para cada malla si es necesario hacerlo. Aquí asumo que las mallas están correctamente agrupadas, para evitar interruptores redundantes.

Author: Patryk Czachurski, 2011-01-10

3 answers

La mayoría de los motores modernos que conozco tienen un "shader cache" y usan la segunda opción, porque aparentemente es más rápido.

También puede echar un vistazo a la ARB_shader_subroutine que permite la vinculación dinámica. Pero creo que solo está disponible en hardware de clase DX11.

 28
Author: Axel Gneiting,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-10 18:14:17

Generalmente, la opción 2 será más rápida/mejor a menos que tenga un número realmente enorme de programas. También puede usar objetos de búfer compartidos entre programas para que no necesite restablecer ningún valor cuando cambie de programa.

Además, una vez que vincule un programa, puede liberar todos los shaders que vinculó al programa. Esto liberará todo el código fuente y cualquier información previa al enlace que el controlador mantenga, dejando solo el programa completamente vinculado en la memoria.

 15
Author: Chris Dodd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-10 19:37:33

Tendería a creer que depende de la aplicación específica. Y sí, ya que sería más eficiente decir ejecutar 100 programas donde cada uno puede tener alrededor de 2-16 uniformes cada uno; puede ser mejor tener un intercambio de los dos. Tendería a pensar que decir tal vez 10 - 20 programas para sus técnicas de sombreado más comunes sería suficiente o unos pocos más. Por ejemplo, es posible que desee tener un programa / sombreador para hacer toda su asignación de baches, uno para hacer todos sus efectos de niebla, uno para hacer reflexiones, otro para hacer refracciones.

Ahora, fuera del alcance de su pregunta, creo que también pertenecería aquí, una cosa a incorporar en su motor sería una configuración de la clase BatchProcess & BatchManager para reducir la cantidad de llamadas CPU - GPU sobre el bus, ya que esto también resultaría eficiente. No creo que haya una solución 1 para todos a su pregunta, ya que creo que sería una aplicación específica al igual que establecer la relación entre cuántos lotes (cubos) de vértices (primitivas) que tendría su motor y cuántos vértices contendría cada uno de esos lotes.

Para tratar de dejar esto un poco más claro: un juego puede tener 4 contenedores o lotes donde cada lote puede contener hasta 10,000 vértices para ser considerado como lleno antes de que el BatchManager decida vaciar ese cubo enviando todos esos vértices a la Tarjeta Gráfica para que la canalización de renderizado sea procesada y dibujada donde un juego diferente puede tener 10 cubos con 5.000 vértices, u otro juego podría tener 8 cubos con 12.0000 vértices.

Así que podría haber un intercambio de tratar de combinar los dos de acuerdo a sus necesidades. Si usted tiene 1 solo programa con 100s de uniformes; el único programa es más fácil de administrar dentro de la tubería, pero los shaders sería más engorroso de leer y administrar. Por otra parte, tener shaders con muy pocos uniformes es bastante fácil de leer y administrar, pero tener 100 de programas es un poco más difícil de administrar en la CPU antes de vincularlos y enviarlos para que se representen correctamente. Personalmente, trataría de encontrar un punto medio donde tenga suficientes programas para hacer cada tarea específica que sea completamente única entre sí, como hacer densidad de niebla en uno y un mapeo volumétrico de sombras en otro donde cada programa tenga uniformes suficientes para hacer los cálculos requeridos.

El siguiente paso sería entonces hacer algunas pruebas de referencia para ver dónde se equilibra la eficiencia y los gastos generales para hacer el ajustes apropiados.

 0
Author: Francis Cugler,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-14 01:20:11