PDA

View Full Version : enabling/disabling textures



specular1
11-05-2005, 06:59 AM
Hello,

I am wondering how you texture only certain parts of a scene. As a very simple example, I have as a fragment shader

uniform sampler2D texID;

void main(void)
{vec4 texColor = texture2D(texID,gl_TexCoord[0].st);
gl_FragColor = gl_Color * texColor;
}

In my code I have

glEnable(GL_TEXTURE_2D);
...
draw some stuff
...
glDisable(GL_TEXTURE_2D);
...
draw some more stuff
...

However, the entire scene is textured. Without binding an all white texture when I want parts of my scene to 'not be textured', how do I do this?
Are there glsl commands equivalent to glIsEnabled so that I could branch as needed

...
if (glIsEnabled(GL_TEXTURE_2D)){
gl_FragColor = gl_Color * texColor;

}else{

gl_FragColor = gl_Color;
}
...

Or is there some other preferred way?
Any help is appreciated. Thank-you.

Trahern
11-05-2005, 08:52 AM
The prefered way as far as I know is to bind another shader which does not perform texturing ( or to completly disable shaders )

So it can look like this:

bind your texturing shader
...
draw some stuff
...
disable shaders or bind other shader
...
draw some more stuff

Of course you can do this by branching inside the shader ( for example by passing some uniform variable to the shader which determines if the texture look-up should be done ). However branching is still quite slow on the GPU ( especialy in fragment shader since its SIMD )

Zulfiqar Malik
11-05-2005, 01:17 PM
I have never tried this, but you could set the sampler handle to 0.

Trahern
11-05-2005, 03:03 PM
Originally posted by Zulfiqar Malik:
I have never tried this, but you could set the sampler handle to 0.Im not sure if I understand you correctly but setting the sampler to 0 means that you are reading a texture from the texture unit 0 so it would probably not help him much.

but maybe I just misunderstood what you meant :)

specular1
11-06-2005, 06:54 AM
Thanks for the replies. Enabling/disabling the shaders with glUseProgramObjectARB produced the desired results.

As a seperate question (too minor to start a new post), is it possible to use more than one shader program object at once. Example - a shadow map and a texture shader. Is it more/less desirable to seperate shaders when possible or to combine in a larger program, or is it just personal preference?

Trahern
11-06-2005, 07:52 AM
1.Only one shader can be active in given time.
2. On current hardware its usualy better to create separate shaders for most things ( it depends what you want to do ). I think that there are a lot of threads about this topic on this forum so you can find more detail when its better to create a new shader and when its possible to reuse an old one there.

knackered
11-22-2005, 05:24 AM
and of course, this is where modular programming comes in - GLSL supports multiple source files, which you can combine to create specialised shaders simply by plugging your library of functions together in a specific way.

Jedimaster
11-25-2005, 04:05 AM
Yeah! Thanks the all above !

Let me think something more...