Shaders de fragmento: variáveis de saída
Pergunta
Lendo a especificação GLSL 1.40:
As saídas de fragmento só podem ser flutuantes, vetores de ponto flutuante, números inteiros assinados ou não assinados ou vetores inteiros, ou matrizes de qualquer um deles. Matrizes e estruturas não podem ser emitidas. As saídas de fragmento são declaradas como nos seguintes exemplos:
out VEC4 fragmentColor; Luminosidade Uint;
A cor do fragmento é definida escrevendo gl_fragcolor ... está certo? Alguém poderia esclarecer minhas idéias sobre esses resultados? Posso escrever apenas 'fragmentcolor' do exemplo para determinar a cor do fragmento? Posso ler de volta ('luminosidade', por exemplo)?
Solução
Seu exemplo tem 2 saídas. Eles têm slots FBO correspondentes associados após a ligação do programa GLSL. Você pode redirecioná -los usando glBindFragDataLocation
.
Depois de ativar o shader e o FBO vinculado, tudo depende de uma máscara de empate, definida por glDrawBuffers
. Por exemplo, se você passou GL_COLOR_ATTACHMENT0
e GL_COLOR_ATTACHMENT2
Lá, isso significaria que o índice de saída 0 será destinado ao anexo 0 e o índice de saída 1 iria para o anexo de cor 2.
Outras dicas
A variável de saída global GL_FragColor é descontinuada após a versão GLSL 120. Agora você deve dar um nome e digitar sozinho, como no seu exemplo. Em relação a vários resultados, este link fornece informações sobre o mapeamento: http://www.opengl.org/wiki/glsl_objects#program_linking
(E eu encontrei esse link em: http://www.opengl.org/discussion_boards/ubbthreads.php?ubb=showflat&number=270999 )
Espero que isto ajude! : D
Ooops! Vejo que Kvark deu as informações relevantes. Enfim, talvez você tenha tirado algo do meu texto também.
Eu quero dar alguns exemplos:
void add(in float a, in float b, out float c)
{
//you can not use c here. only set value
//changing values of a and b does not change anything.
c = a + b;
}
void getColor(out float r, out float g, out float b)
{
//you can not use r, g, b here. only set value
r = gl_FragColor.r;
g = gl_FragColor.g;
b = gl_FragColor.b;
}
void amplify(inout vec4 pixelColor, in value)
{
//inout is like a reference
pixelColor = pixelColor * value;
}