GLSL: ativar / desativar texturização + shaders
Pergunta
Eu estou procurando uma maneira de acesso OpenGL afirma a partir de um shader. O GLSL Guia de Referência Rápida, um recurso incrível, não poderia realmente me ajudar em um presente.
No exemplo que estou trabalhando eu tenho os dois seguintes shaders:
Vertex:
void main()
{
gl_FrontColor = gl_Color;
gl_TexCoord[0] = gl_MultiTexCoord0;
gl_Position = ftransform();
}
Fragmento:
uniform sampler2D tex;
uniform float flattening;
void main( void )
{
vec4 texel;
texel = texture2D(tex, gl_TexCoord[0].st);
texel.r *= gl_Color.r;
texel.g *= gl_Color.g;
texel.b *= gl_Color.b;
texel.a *= gl_Color.a;
gl_FragColor = texel;
}
Quando estou tornando polígonos que não são texturizados, seus valores alfa são corretas, mas eles são atribuídos a cor preta.
1, Que verificação condicional posso configurar para que a variável 'texel' será definido um vec4(1.0, 1.0, 1.0, 1.0)
ao invés de amostragem de uma textura quando GL_TEXTURE_2D
é deficiente?
2, Será que o processamento mais rápido se eu escrevi diferentes shaders para diferentes modos de texturização e alternar entre elas onde eu usaria glEnable
/ glDisable
(GL_TEXTURE_2D
)?
Solução
Desculpe, mas você não pode acessar esse tipo de estado de GLSL, período.
Na verdade, no futuro GLSL você tem que enviar todos os unforms / atributos a si mesmo, ou seja, não automagic gl_ModelViewMatrix, gl_LightPosition, gl_Normal ou similar. Apenas coisas básicas como gl_Position e gl_FragColor estarão disponíveis.
Esse tipo de vazios sua segunda pergunta, mas você pode sempre usar # ifdef de ativar / desativar partes na sua shader se você achar que mais conveniente do que escrever shaders separadas para diferentes modos de textura.
Relacionada, observe que ramificação é geralmente bastante lento por isso, se você tem a necessidade de velocidade não evitá-lo tanto quanto possível. (Este assuntos dinâmica especialmente irregular ramificação, como fragmentos são processados ??em blocos de SIMD e todos os fragmentos em um bloco devem calcular as mesmas instruções, mesmo que só se aplicam para um ou alguns fragmentos.)
Outras dicas
Um método que eu vi é para ligar uma textura 1x1 com um único texel de (1.0, 1.0, 1.0, 1.0) ao renderizar polígonos que não são texturizados. Um interruptor de textura deve ser menos caro do que um interruptor de shader e uma textura 1x1 vai caber inteiramente dentro do cache de textura.