GLSL: ativar / desativar texturização + shaders

votos
3

Eu estou procurando uma maneira de acessar estados OpenGL de um shader. O GLSL Guia de Referência Rápida , um recurso incrível, realmente não podia me ajudar em um presente.

No exemplo que estou trabalhando eu tenho os dois seguintes shaders:

Vértice:

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 estão corretas, mas eles estão atribuídos a cor preta.

1, que verificação condicional posso configuração para que o 'texel' variável será definida uma vec4(1.0, 1.0, 1.0, 1.0)vez de amostragem de uma textura quando GL_TEXTURE_2Destá desativado?

2, seria 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)?

Publicado 19/05/2009 em 20:31
fonte usuário
Em outras línguas...                            


2 respostas

votos
8

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, sem 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ê sempre pode usar para ativar / desativar as partes do # ifdef em sua shader se você achar que mais conveniente do que escrever shaders separadas para diferentes modos de textura.

Relacionado, fazer notar que ramificação é geralmente bastante lento por isso, se você tem a necessidade de velocidade não evitá-lo tanto quanto possível. (Isso é importante ramificação dinâmico especialmente irregular, 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.)

Respondeu 19/05/2009 em 20:59
fonte usuário

votos
3

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.

Respondeu 03/02/2012 em 19:38
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more