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
- Discussão sobre meta sobre duplicatas entre sites e se elas são um problema
- Se você tiver perguntas adicionais, poste-as como novas perguntas em vez de editá-las em uma já existente. forma como as respostas a perguntas separadas podem ser comparadas de forma independente. Você ainda pode incluir links entre as perguntas se elas estiverem relacionadas.
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.