Mapping several Textures on the same surface


I am rendering a cylinder and mapping two different textures to the top and to the bottom face.

Both the textures are loaded in the following way:

check3dFloorFile = new File(check3dFloorPath);
        try {
            check3dFloorTexture = TextureIO.newTexture(check3dFloorFile, true);
        } catch (IOException | GLException ex) {
            Logger.getLogger(Viewer.class.getName()).log(Level.SEVERE, null, ex);
        check3dFloorTexture.setTexParameteri(gl, GL2.GL_TEXTURE_MIN_FILTER, 
        check3dFloorTexture.setTexParameteri(gl, GL2.GL_TEXTURE_MAG_FILTER, GL2.GL_LINEAR);
        check3dFloorBackFile = new File(check3dFloorBackPath);
        try {
            check3dFloorBackTexture = TextureIO.newTexture(check3dFloorBackFile, true);
        } catch (IOException | GLException ex) {
            Logger.getLogger(Viewer.class.getName()).log(Level.SEVERE, null, ex);
        check3dFloorBackTexture.setTexParameteri(gl, GL2.GL_TEXTURE_MIN_FILTER, 
        check3dFloorBackTexture.setTexParameteri(gl, GL2.GL_TEXTURE_MAG_FILTER, GL2.GL_LINEAR);

The problem arises when I try to render to a texture (a blank one, that has nothing to do with this first two ones):

gl.glGenTextures(1, textureID, 0);
        gl.glBindTexture(GL2.GL_TEXTURE_2D, textureID[0]);
        gl.glTexParameteri(GL2.GL_TEXTURE_2D, GL2.GL_TEXTURE_WRAP_S, GL2.GL_REPEAT);
        gl.glTexParameteri(GL2.GL_TEXTURE_2D, GL2.GL_TEXTURE_WRAP_T, GL2.GL_REPEAT);
        // null means reserve texture memory, but texels are undefined
        gl.glTexImage2D(GL2.GL_TEXTURE_2D, 0, GL2.GL_RGB, floorWidth, floorHeight,
                                                    0, GL2.GL_RGB, GL2.GL_FLOAT, null);
        gl.glGenFramebuffers(1, frameBufferID, 0);
        gl.glBindFramebuffer(GL2.GL_FRAMEBUFFER, frameBufferID[0]);
        //Attach 2D texture to this FBO
        gl.glFramebufferTexture2D(GL2.GL_FRAMEBUFFER, GL2.GL_COLOR_ATTACHMENT0, 
                                        GL2.GL_TEXTURE_2D, textureID[0], 0);
        // depth buffer
        //int[] depthRenderBufferID = new int[1];
        gl.glGenRenderbuffers(1, depthRenderBufferID, 0);
        gl.glBindRenderbuffer(GL2.GL_RENDERBUFFER, depthRenderBufferID[0]);
        gl.glRenderbufferStorage(GL2.GL_RENDERBUFFER, GL2.GL_DEPTH_COMPONENT, 
                                                floorWidth, floorHeight);
        gl.glFramebufferRenderbuffer(GL2.GL_FRAMEBUFFER, GL2.GL_DEPTH_ATTACHMENT,
                                            GL2.GL_RENDERBUFFER, depthRenderBufferID[0]);
        if(gl.glCheckFramebufferStatus(GL2.GL_FRAMEBUFFER) == GL2.GL_FRAMEBUFFER_COMPLETE)
            System.out.println("[Viewer] GL_FRAMEBUFFER_COMPLETE!!");
            System.out.println("..cazzo ^^");

As soon as this code is executed, the texture mapped on the top of the cylinder disappears and all the top turns to black…


Ps: my task is to map this third rendered texture on the top of the cylinder, over the already existing one…


are you working with glActiveTexture() to select multiple texture units? Otherwise binding a texture will “hide” the last one. To use multiple textures in the same draw call you need to bind each texture to a different texture unit (selected by glActiveTexture).

Yeah, I already looked at that, but I dont know how I can combine a glActiveTexture() with a Texture object (like my check3dFloorFile)

You need to select different texture units and bind your textures to different units if you want multi-texturing:

glActiveTexture( texture_unit )
glBindTexture2D( … ); <- texture is now bound to texture_unit

The problem(s) is that first, I dont have any glBindTexture2D, just public void glBindTexture(int i, int i1) and second, it accepts only integer (as you can see)

Sorry, should be glTexture( GL_TEXTURE_2D, … ) instead of glTexture2D!

glTexture gets an GLenum and a GLuint.

Sorry, but I dont get what you mean…

OK, maybe I don’t quite get your problem, can you post a screenshot and explain again what’s wrong?

Im facing other problem, I will be back to you as soon as I can

Ok Menzel, I got it, thanks you very much!

Here is how I solved:

            check3dFloorTexture.setTexParameteri(gl, GL2.GL_TEXTURE_MIN_FILTER, GL2.GL_LINEAR);
            check3dFloorTexture.setTexParameteri(gl, GL2.GL_TEXTURE_MAG_FILTER, GL2.GL_LINEAR);
            gl.glBindTexture(GL2.GL_TEXTURE_2D, textureID[0]);
            gl.glTexParameteri(GL2.GL_TEXTURE_2D, GL2.GL_TEXTURE_MIN_FILTER, GL2.GL_LINEAR);
            gl.glTexParameteri(GL2.GL_TEXTURE_2D, GL2.GL_TEXTURE_MAG_FILTER, GL2.GL_LINEAR);
                gl.glMultiTexCoord2f(GL2.GL_TEXTURE0, 0.0f, 0.0f);
                gl.glMultiTexCoord2f(GL2.GL_TEXTURE1, 0.0f, 0.0f);
                gl.glVertex3f(-a, -a, 0);
                gl.glMultiTexCoord2f(GL2.GL_TEXTURE0, 0.0f, 1.0f);
                gl.glMultiTexCoord2f(GL2.GL_TEXTURE1, 0.0f, 1.0f);
                gl.glVertex3f(-a, a, 0);

                gl.glMultiTexCoord2f(GL2.GL_TEXTURE0, 1.0f, 1.0f);
                gl.glMultiTexCoord2f(GL2.GL_TEXTURE1, 1.0f, 1.0f);
                gl.glVertex3f(a, a, 0);
                gl.glMultiTexCoord2f(GL2.GL_TEXTURE0, 1.0f, 0.0f);
                gl.glMultiTexCoord2f(GL2.GL_TEXTURE1, 1.0f, 0.0f);
                gl.glVertex3f(a, -a, 0);
            //  GL_TEXTURE1