Light shader and texture (in display lists...)
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.
It depends what all is in the display list and what exactly you're trying to do.
Originally Posted by AllForum
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...
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
In the fragment shader I retrieve the texel :
- vec4 texel = texture2D(TextureID, gl_TexCoord.st);
Does this work ?
If yes I will search why the texture is black...
The answer is: NO.
The first parameter of texture2D is not a texture ID. Setting texture inside DL is generaly a bad idea.
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.
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.
[Edit] No more strange opengl errors. I sent invalid values with glUniform.[/Edit]
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.
[Edit2] All works ; I tested with tranparency too. [/Edit2]
Last edited by AllForum; 12-26-2012 at 10:07 AM.