PDA

View Full Version : Mapping several Textures on the same surface



elect
02-09-2012, 07:55 AM
Hi,

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(Leve l.SEVERE, null, ex);
* * * *}
* * * *
* * * *check3dFloorTexture.setTexParameteri(gl, GL2.GL_TEXTURE_MIN_FILTER,
* * * * * * * * * * * * * * * * * * * * * * * * * *GL2.GL_LINEAR_MIPMAP_LINEAR);
* * * *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(Leve l.SEVERE, null, ex);
* * * *}
* * * *
* * * *check3dFloorBackTexture.setTexParameteri(gl, GL2.GL_TEXTURE_MIN_FILTER,
* * * * * * * * * * * * * * * * * * * * * * * * * *GL2.GL_LINEAR_MIPMAP_LINEAR);
* * * *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);
* * * *gl.glTexParameteri(GL2.GL_TEXTURE_2D, GL2.GL_TEXTURE_MIN_FILTER, GL2.GL_NEAREST);
* * * *gl.glTexParameteri(GL2.GL_TEXTURE_2D, GL2.GL_TEXTURE_MAG_FILTER, GL2.GL_NEAREST);
* * * *
* * * *// 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!!");
* * * *else
* * * * * *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..

Why?

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

menzel
02-09-2012, 10:56 AM
Hello,

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).

elect
02-10-2012, 02:27 AM
Hello,

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)

menzel
02-10-2012, 03:01 AM
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

elect
02-17-2012, 07:18 AM
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)

menzel
02-17-2012, 07:30 AM
Sorry, should be glTexture( GL_TEXTURE_2D, ... ) instead of glTexture2D!

glTexture gets an GLenum and a GLuint.

elect
02-17-2012, 08:27 AM
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..

menzel
02-17-2012, 10:02 AM
OK, maybe I don't quite get your problem, can you post a screenshot and explain again what's wrong?

elect
02-20-2012, 06:43 AM
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

elect
02-27-2012, 01:16 AM
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


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

Here is how I solved:


gl.glActiveTexture(GL2.GL_TEXTURE0);
check3dFloorTexture.enable(gl);
check3dFloorTexture.bind(gl);

check3dFloorTexture.setTexParameteri(gl, GL2.GL_TEXTURE_MIN_FILTER, GL2.GL_LINEAR);
check3dFloorTexture.setTexParameteri(gl, GL2.GL_TEXTURE_MAG_FILTER, GL2.GL_LINEAR);

gl.glActiveTexture(GL2.GL_TEXTURE1);
gl.glEnable(GL2.GL_TEXTURE_2D);
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.glBegin(GL2.GL_QUADS);
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.glEnd();

// GL_TEXTURE1
gl.glDisable(GL2.GL_TEXTURE_2D);
gl.glActiveTexture(GL2.GL_TEXTURE0);
check3dFloorTexture.disable(gl);