Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

GLSL: enabling/disabling texturing + shaders

I'm looking for a way to access OpenGL states from a shader. The GLSL Quick Reference Guide, an awesome resource, couldn't really help me out on this one.

In the example I'm working on I have the two following shaders:

Vertex:

void    main()
{
    gl_FrontColor = gl_Color;
    gl_TexCoord[0] = gl_MultiTexCoord0;
    gl_Position = ftransform();
}

Fragment:

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;
}

When I'm rendering polygons that are not textured, their alpha values are correct, but they're assigned the color black.

1, What conditional check can I setup so that the variable 'texel' will be set a vec4(1.0, 1.0, 1.0, 1.0) rather than sampling from a texture when GL_TEXTURE_2D is disabled?

2, Would the processing be faster if I wrote different shaders for different texturing modes and switch between them where I would use glEnable/glDisable(GL_TEXTURE_2D)?

like image 740
zyndor Avatar asked Dec 23 '22 11:12

zyndor


1 Answers

Sorry, but you can't access that kind of state from GLSL, period.

In fact, in the future GLSL you have to send all unforms/attributes yourself, i.e. no automagic gl_ModelViewMatrix, gl_LightPosition, gl_Normal or the like. Only basic stuff like gl_Position and gl_FragColor will be available.

That sort of voids your second question, but you could always use #ifdef's to enable/disable parts in your shader if you find that more convenient than writing separate shaders for different texture modes.

Related, do note that branching is generally rather slow so if you have the need for speed do avoid it as much as possible. (This matters especially irregular dynamic branching, as fragments are processed in SIMD blocks and all fragments in a block must compute the same instructions, even if they only apply for one or a few fragments.)

like image 146
Macke Avatar answered Jan 16 '23 03:01

Macke