Greeting to everyone in this forum
I've got a problem with loading more than one texture. My program displays two boxes and I tried to texturemap each box. As long as I use only one texture everything seems to be fine. But when I load a second texture the first one won't be displayed. The box with the first texture displays completly white but the second box is texture mapped with the second loaded texture. Here is the code which i use to initialise OpenGL:
The code is mainly for the Book "OpenGL Programming for the X Window System" by Mark KilgardCode :Colormap cmap; XSetWindowAttributes swa; GLXContext glxContext; XVisualInfo *vi; static int dblBuf[] = {GLX_RGBA, GLX_RED_SIZE, 8, GLX_GREEN_SIZE, 8, GLX_BLUE_SIZE, 8, GLX_DEPTH_SIZE, 24, GLX_DOUBLEBUFFER, None}; // open connection to X-Server dpy = XOpenDisplay(NULL); if (dpy == NULL) { cerr << "could not open display" << endl; exit(1); } // check for GLX extension if (!glXQueryExtension(dpy, NULL, NULL)) { cerr << "could not find OpenGL GLX extension" << endl; exit(1); } // check for appropriate visual vi = glXChooseVisual(dpy, DefaultScreen(dpy), dblBuf); if (vi == NULL) { cerr << "could not find appropriate visual" << endl; exit(1); } // create the glx rendering context glxContext = glXCreateContext(dpy, vi, None, True); if (glxContext == NULL) { cerr << "could not create a rendering context" << endl; } // create a colormap cmap = XCreateColormap(dpy, RootWindow(dpy, vi->screen), vi->visual, AllocNone); swa.colormap = cmap; swa.border_pixel = 0; swa.event_mask = ExposureMask | ButtonPressMask | StructureNotifyMask; win = XCreateWindow(dpy, RootWindow(dpy, vi->screen), 0, 0, 320, 240, 0, vi->depth, InputOutput, vi->visual, CWBorderPixel | CWColormap | CWEventMask, &swa); XSetStandardProperties(dpy, win, "Engine", "OpenGLEngine", None, argv, argc, NULL); // bind rendering contex to window glXMakeCurrent(dpy, win, glxContext); XMapWindow(dpy, win); // configure OpenGL context glClearColor(0.0, 0.0, 0.0, 0.0); glClearDepth(1.0); glEnable(GL_DEPTH_TEST); glShadeModel(GL_FLAT); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glFrustum(-1.0, 1.0, -1.0, 1.0, 1.0, 10.0); // set the clear-color // enable Vertex Arrays glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY);
My drawing loop look somthing like this:
where objList->drawObjects() calls the draw method for each Object (till now only one -> my boxes)Code :bool OpenGLEngine::redraw() { glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef(0.0, 0.0, -5.0); glRotatef(xangle, 1.0, 0.0, 0.0); glRotatef(yangle, 0.0, 1.0, 0.0); glRotatef(zangle, 0.0, 0.0, 1.0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); if (objList->drawObjects() != true) { cerr << "OpenGLEngine::redraw: Error while drawing the list" << endl; return false; } glXSwapBuffers(dpy, win); return true; }
texture->activateTexture() is implemented like this:Code :bool OpenGLEngineObject::draw() { texture->activateTexture(); glVertexPointer(3, GL_FLOAT, 0, vertices); glTexCoordPointer(2, GL_FLOAT, 0, textureCoords); glDrawArrays(GL_QUADS, 0, 16); texture1->activateTexture(); glTranslatef(0.0, 2.5, 0.0); glDrawArrays(GL_QUADS, 0, 16); return true; }
when enabling the commented glTexImage2D line everything works just fine. But if i get it right the whole texture will copied to video-ram each time I call OpenGLEngineTexture::activateTexture. I thought, that I can bind a texture, copy the image data to video-ram and need only to bind the texture again to use it.Code :bool OpenGLEngineTexture::activateTexture() { glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, texture); //glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, imageBuffer); return true; }
Here is the code i use to load the texture:
the number in textures is generated by callingCode :// a lot of libpng-function calls to load my texture // and copy the imagedata to GLubyte * imageBuffer // which contains the image in RGBA format cout << "textureNr: " << texture << endl; // prints 1 for first and 2 for second texture glBindTexture(GL_TEXTURE_2D, texture); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, imageBuffer); glEnable(GL_TEXTURE_2D); if (glIsTexture(texture) == GL_TRUE) { cout << "texture bound" << endl; // output for both textures } else { cout << "texture not bound" << endl; } cout << "texture height: " << height << " - width: " << width << endl; // prints 256x256 for both textures return true;
and texNr is given to the textureCode :glGenTextures(1, texNr);
I'm working under linux (LFS - Linux from scratch) with XFree 4.3.0.
Hardware: GForce4600 (driver 41.91)
I hope I've given the most importand informations.
Thanx in advance
olorin
Please excuse my poor english
[This message has been edited by olorin (edited 04-21-2003).]



