EDITAR: Esta é uma duplicata de uma pergunta do estouro da pilha: https://stackoverflow.com/questions/9222217/how-does-the-fragment-shader-know-what-variable-to-use-for-the-color-of-a-pixel

Se você deseja enviar um valor do sombreador de vértice para o sombreador de fragmento, o sombreador de vértice deve declarar uma variável como out, o sombreador de fragmento deve declarar outra variável como in e ambas as variáveis devem ter seus nomes e tipos iguais. Mas isso não acontece quando você deseja enviar o valor da cor do sombreador de fragmento. Na verdade, você pode chamar a variável de saída como quiser. Por quê? Na versão anterior, havia uma variável chamada gl_FragColor
Como o programa vincula sua variável de fragmento de saída com gl_FragColor?

Comentários

Resposta

Funciona quase exatamente da mesma maneira que as entradas de sombreador de vértice.

Em sombreadores de vértice, você tem entradas. E essas entradas representam índices de atributo de vértice, os números que você passa para glVertexAttribPointer e

e assim por diante. Você configura qual entrada extrai de qual atributo. Em GLSL 3.30, você usa esta sintaxe:

layout(location = 2) in color; 

Isso define a color entrada do shader de vértice para vir do atributo local 2. Antes de 3.30 (ou sem ARB_explicit_attrib_location), você teria que configurar isso explicitamente com glBindAttrbLocation antes vincular ou consultar o programa para obter o índice de atributo com glGetAttribLocation . Se você não fornecer explicitamente um local de atributo, GLSL atribuirá um local arbitrariamente (ou seja: de uma maneira definida pela implementação).

Configurá-lo no sombreador é quase sempre a melhor opção.

Em qualquer caso, as saídas do shader de fragmento funcionam quase exatamente da mesma maneira. Shaders de fragmento podem gravar em várias cores de saída , que são mapeados para vários buffers no framebuffer . Portanto, você precisa indicar qual saída vai para qual cor de saída de fragmento.

Isso o processo começa com o valor do local de saída do fragmento. É definido de maneira muito semelhante aos locais de entrada do sombreador de vértice:

layout(location = 1) out secColor; 

Existem também as funções de API glBindFragDataLocation e glGetFragDataLocation , que são análogos a glBindAttribLocation e glGetAttribLocation.

Se você não fizer nenhum assistente explícito gnments, as implementações geralmente atribuirão uma de suas variáveis de saída ao local 0. No entanto, o padrão OpenGL não requer esse comportamento, então você também não deve depender dele.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *