View Full Version : Light shader and texture (in display lists...)

12-19-2012, 09:15 AM

I had an old code like this :

I replaced it with :
SendColor with glUniform

But in some display lists there are textures. And in these cases my shader does not render the texture...
I have seen today that in classical code the textures are sent to the shader.

I can not change the display lists code (lot of old existing code...).

1- What can I do to obtain the correct rendering (I am a beginner...) ?
2- Is there a solution with minor change in the display lists ?

Thanks for your advices.

Dark Photon
12-19-2012, 05:22 PM
1- What can I do to obtain the correct rendering (I am a beginner...) ?
2- Is there a solution with minor change in the display lists ?
It depends what all is in the display list and what exactly you're trying to do.

12-20-2012, 01:29 AM
The display lists draw geometry with old opengl 1.1 functions :
- they set geometry attributes : line width, line stipple, polygon stipple or texture
- they draw the geometry with basic functions and glutess
they draw text : i do not understand the code but it seems to be only geometry (wglUseFontOutlines, gl_quads and glutess).

The shader I added is a simple phong shader to add light.
And I suppressed the glcolor because I learned here that it's wrong to use old opengl 1.1 functions. ;)
But I did not thought to the textures... I did not read things about textures when I read how a shader works...

And I use opengl 2.0 or 2.1...

12-24-2012, 07:40 AM

I am trying something but it does not work yet. I would like to know if it may work :

- I create a display list and store the textureID used during the display list creation.

When I render :
- Send textureID with glUniform to the fragment shader
- glCallList(l);

In the fragment shader I retrieve the texel :
- vec4 texel = texture2D(TextureID, gl_TexCoord[0].st);

Does this work ?
If yes I will search why the texture is black...


12-24-2012, 09:03 AM
The answer is: NO.
The first parameter of texture2D is not a texture ID. Setting texture inside DL is generaly a bad idea.

12-24-2012, 04:15 PM
Let me explain the previous answer a little bit better...
The first parameter of the texture2D is a sampler. A sampler defines which texture unit will be used for the texture lookup.
To associate a texture to a texture unit you should use glActiveTexture(...);/glBindTexture(...); pair. The value in the sampler should be the value set in glActiveTexture(value) (or to bi more precise, value-GL_TEXTURE0). As you can see, glBindTexture(...) should be call explicitly in GL code.

Considering DLs, binding textures should be done outside of them. There are different problems if you do in in a compiled DL. From very slow execution to different anomalies. Try to pull them out of DLs to see if there are any improvements.

12-26-2012, 06:07 AM
Thanks for your help.
I did stupid things with texture id in place of sampler.
Now without changing my code but with the pair glActiveTexture(...);/glBindTexture(...); I can see my texture.

No more strange opengl errors. I sent invalid values with glUniform.

Is your advice concerning binding textures in DLs general or only when using shaders ? (we never had problem with our basic opengl 1.1 code).

Thanks for your help : I did not know what was wrong and I did not know what to try. I have things to test now.
All works ; I tested with tranparency too.

Thanks !