¿Necesito volver a unir uniformes o atributos al cambiar los programas de sombreado?

11

La representación de la escena generalmente implica más de un programa de sombreado que, en mi caso, todos usan los mismos atributos y comparten al menos algunos de los uniformes. Para que funcionen correctamente, actualmente juego con seguridad, lo que significa que vuelvo a unir los atributos y obtengo las ubicaciones uniformes apropiadas cada vez que cambio entre programas de sombreado. Entonces, básicamente, varias veces en cada cuadro, lo que probablemente no sea el mejor enfoque.

Entonces, ¿es (en general) necesario volver a unir atributos y uniformes después de cambiar los programas de sombreado? ¿Y por qué?

Si es así, ¿hay alguna manera de hacer esto una vez al inicio del programa y nunca tener que tocarlos nuevamente (excepto para establecer los valores uniformes)?

Nerón
fuente

Respuestas:

12

No necesita volver a vincular los atributos, siempre y cuando se asegure de que su ubicación permanezca igual en ambos sombreadores. (Por lo general, se utiliza la layout(location = X)sintaxis en GLSL, pero también se puede hacer glBindAttribLocationsi el primero no está disponible).

Sin embargo, los uniformes son parte del estado del objeto Shader, por lo que deberán establecerse al menos una vez para cada sombreador. Una forma de minimizar el costo de esto es usar un Objeto de buffer uniforme , que contendrá todos sus valores uniformes y luego se puede vincular a un sombreador con una sola llamada.

yuriks
fuente
En su enlace de UBO: "Por último, se pueden usar para compartir información entre diferentes programas. Por lo tanto, modificar un solo búfer puede permitir la actualización de uniformes en múltiples programas".
Zouch