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)?

Foi útil?

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;
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top