palavras-chave in / out no GLSL

46

Eu realmente não entendo como usar as in/ outkeywords no GLSL, e o Google está sendo incomumente inútil.

O que exatamente eles fazem? Como eu os usaria se, por exemplo, eu desejasse passar um conjunto variável de variáveis ​​por vértice para o shader de fragmento?

Literalmente, todo tutorial que encontro usa as varying/ attributekeywords e isso não ajuda.

Avi
fonte

Respostas:

65

Os qualificadores de armazenamento ine outrealmente têm uma finalidade que contém e substitui a de varyinge attribute. Eles definem quais variáveis ​​são, respectivamente, em put e out put para o shader. Veja a página 7 do cartão de referência GLSL 4.2 :

  • in: ligação ao shader do estágio anterior
  • out: ligação de um sombreador para a próxima etapa
  • attribute: igual inao shader de vértice
  • varying: igual outao sombreador de vértice, igual inao sombreador de fragmento (Nota: estes são erroneamente trocados no cartão de referência mencionado acima.)

Com a observação lateral, os dois últimos foram descontinuados: eles não estão presentes no perfil principal do 4.2, apenas no perfil de compatibilidade.


O que exatamente eles fazem?

Quanto ao uso, leve o sombreador de vértice de Uma introdução ao OpenGL moderno. Capítulo 2.2: Shaders :

#version 110

attribute vec2 position;    
varying vec2 texcoord;

void main()
{
    gl_Position = vec4(position, 0.0, 1.0);
    texcoord = position * vec2(0.5) + vec2(0.5);
}

Deve ser reescrito no núcleo 4.2 como:

#version 420

in vec2 position;    
out vec2 texcoord;

void main()
{
    gl_Position = vec4(position, 0.0, 1.0);
    texcoord = position * vec2(0.5) + vec2(0.5);
}

Tutoriais inúteis

Suponho que a principal razão pela qual você encontra o código do tutorial "desatualizado" é que nem todos têm acesso ao hardware compatível com GLSL 3.3+. Independentemente disso, para um tutorial bom e mais atualizado, eu o indicarei com prazer na direção da Aprendizagem da Programação Gráfica Moderna em 3D de Nicol Bolas .

Eric
fonte
2
@NicolBolas Ha! Eu já imaginei que havia algo suspeito nisso. Isso é um erro nesse cartão de referência então. Obrigado! :-)
Eric