alterar a cor de um vértice em um sombreador de vértice
-
23-09-2019 - |
Pergunta
É possível definir a cor de um único vértice usando um programa GLSL vertex shader, da mesma forma que gl_Position altera a posição de um vértice?
Solução
Para versões do GLSL anteriores à versão 1.30, você deseja gravar no gl_FrontColor
ou gl_BackColor
built-ins, que são variantes acessíveis no sombreador de vértice.Leia sobre as variações na especificação GLSL 1.10 (http://www.opengl.org/registry/doc/GLSLangSpec.Full.1.10.59.pdf) para saber mais sobre eles ou a especificação da extensão GL_ARB_vertex_shader.
gl_FrontColor
e gl_BackColor
são vetores RGBA 4D que utilizam escalares de ponto flutuante normalizados.
Mas isso irá definir todos os vértices para vermelho, não apenas um vértice.Isso ocorre porque o mesmo sombreador de vértice é executado para todos os vértices.Se você quiser definir cores individuais, use glColorPointer
junto com glDrawArrays
, glDrawElements
, glDrawRangeElements
ou glMultiDrawElements
.A cor do vértice definida por glColorPointer
pode ser lido como gl_Color
no sombreador de vértice. gl_Color
no sombreador de vértice há um atributo por vértice.
Para ler a cor que você escreveu no sombreador de vértice, no sombreador de fragmento, leia a variação integrada gl_Color
.Os fragmentos finalizados devem ser gravados em gl_FragColor
.
Exemplo de sombreador de vértice:
void main()
{
gl_FrontColor = gl_Color;
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}
Exemplo de shader de fragmento:
void main()
{
gl_FragColor = gl_Color;
}
Além disso, para fazer com que o vertex shader defina as variações exatamente como o pipeline de função fixa OpenGL, chame a função ftransform().
void main()
{
ftransform();
}