PDA

View Full Version : problem with passing textures to GLSL Shaders



divas
08-14-2009, 05:49 AM
hello ,

i am a newbie in opengl but i have given a difficult task of creating an ray cast application for which i need to pass 4- 5 textures to my glsl shaders. i have 2 issues

ISSUE 1)

when i pass textures to my shaders like this , i get the output image on my screen

texture_locationTemp = glGetUniformLocation(p2, "temporarytexture");
glUniform1i(texture_locationTemp, 1);
texture_locationVol = glGetUniformLocation(p2, "VolumeTexture");
glUniform1i(texture_locationVol, 2);
texture_locationDir = glGetUniformLocation(p2, "Directiontexture");
glUniform1i(texture_locationDir,3);


glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, swapLogic[ 1- currentSurface]);
glActiveTexture(GL_TEXTURE2);
glBindTexture(GL_TEXTURE_3D, Volumetex3d);
glActiveTexture(GL_TEXTURE3);
glBindTexture(GL_TEXTURE_2D, texIDBack);


But when i pass textures like this (Starting from location GL_TEXTURE0 instead of GL_TEXTURE1), i get the distored image.


texture_locationTemp = glGetUniformLocation(p2, "temporarytexture");
glUniform1i(texture_locationTemp, 0);
texture_locationVol = glGetUniformLocation(p2, "VolumeTexture");
glUniform1i(texture_locationVol, 1);
texture_locationDir = glGetUniformLocation(p2, "Directiontexture");
glUniform1i(texture_locationDir,2);


glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, swapLogic[ 1- currentSurface]);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_3D, Volumetex3d);
glActiveTexture(GL_TEXTURE2);
glBindTexture(GL_TEXTURE_2D, texIDBack);

i am not able to understand this starange behavior , seems like
GL_TEXTURE0 does not work.


ISSUE 2)

ISSUE 2 is related to issue 1)

in the beginning before starting rendering ( before onpaint method),
i m creating 7-8 2d textures and 1-2 3d textures which i will pass further to my shaders during final rendering step... and this code is executed only once during execution..

Gluint Volumetex3d = textureHandlerObj.Create3DTexture(path,rawdata);

Gluint texIDEmptySpaceTexture = Create3DTextureEmptyScpaceTexture();

Gluint crop2dTex = Create2DTexture(viewPort.width,viewPort.height);

Gluint texIDBack = Create2DTexture(viewPort.width,viewPort.height);

Gluint texIDfront = Create2DTexture(viewPort.width,viewPort.height);


...
....

the issue is that if i change the order of creation of these textures, the output on my screen changes....

for instance if i change the order to

Gluint Volumetex3d = textureHandlerObj.Create3DTexture(path,rawdata);

Gluint texIDEmptySpaceTexture = Create3DTextureEmptyScpaceTexture();

Gluint crop2dTex = Create2DTexture(viewPort.width,viewPort.height);

Gluint texIDfront = Create2DTexture(viewPort.width,viewPort.height);

Gluint texIDBack = Create2DTexture(viewPort.width,viewPort.height);


now texidFront is created before textureIdBack.....

code inside all this functions like similar to this ( using GL_TEXTURE_2D for 2d texture and GL_TEXTURE_3D for 3d texture)...

GLuint img;
glGenTextures(1, &img);
glBindTexture(GL_TEXTURE_2D, img);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16F_ARB, width, height, 0, GL_RGBA, GL_FLOAT, data);

i dont understand why order of creation of this textures effect my output....

what i think can be a bug is

if i use the order no 1 then the the texture binded to GL_TEXTURE_2D after the end of the function is texIdfront but if i use order no 2 then it is texIdBack ..

i think this binding switch is somewhere casuing the problem due to which these textures are not passed to shaders properly which cause the distortion.

but i m not able to find out what i am missing and what i have to do to make it work for any order ( why it deopends upon order)....

PLZ HELP .. :(

V-man
08-14-2009, 07:35 AM
I've never seen that behavior. Are you sure you have a shader bound (glUseProgram) before calling glUniform?

I can also suggest a debugger http://www.opengl.org/wiki/Debugging_Tools

divas
08-14-2009, 08:09 AM
yes i m pretty sure that i m using the glUseprogram....

as i have told i m getting output if i use a particular sequence of code ...

like using GL_TEXTURE1 instead of GL_TEXTURE0 inside glActiveTexture function.

and also if i used particular order of Texture creation...

so shader is definitely being used.

i need a debugger , which allow me to put breakpoints inside my shader file.

divas
08-16-2009, 11:16 PM
i m an Idiot ... unknowingly i have commented some of my code due to which i was getting the weird results...

this topic can be closed.... :)