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,
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(Level.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..
You need to unbind the texture first from the texture target, before a framebuffer it has been attached to can be selected as render target. Since you don’t do this, you’ll render nothing to that texture thus it will come out blank.