Preciso religar uniformes ou atributos ao alterar programas de sombreador?

11

A renderização da cena geralmente envolve mais de um programa de sombreador que, no meu caso, todos usam os mesmos atributos e compartilham pelo menos alguns dos uniformes. Para que eles funcionem corretamente, atualmente jogo seguro, o que significa que religo os atributos e obtenho os locais uniformes apropriados toda vez que alterno entre programas de sombreador. Então, basicamente, várias vezes em cada quadro, o que provavelmente não é a melhor abordagem.

Portanto, é (em geral) necessário religar atributos e uniformes após a troca de programas de sombreador? E porque?

Nesse caso, existe uma maneira de fazer isso uma vez no início do programa e nunca mais precisar tocá-los (exceto para definir os valores uniformes)?

Nero
fonte

Respostas:

12

Você não precisa religar os atributos, desde que garanta que a localização deles permaneça a mesma nos dois shaders. (Geralmente, usa a layout(location = X)sintaxe no GLSL, mas também pode ser feita glBindAttribLocationse o antigo não estiver disponível.)

Os uniformes, no entanto, fazem parte do estado Shader Object e, portanto, precisam ser definidos pelo menos uma vez para cada shader. Uma maneira de minimizar o custo disso é usar um Objeto de Buffer Uniforme , que conterá todos os seus valores uniformes e poderá ser vinculado a um sombreador com uma única chamada.

yuriks
fonte
No seu link UBO: "Por fim, eles podem ser usados ​​para compartilhar informações entre diferentes programas. Portanto, a modificação de um único buffer pode efetivamente permitir a atualização de uniformes em vários programas".
Zouch 02/02