Я представляю цилиндр и сопоставляю две разные текстуры сверху и снизу.Отображение нескольких текстур на одной и той же поверхности
Оба текстуры загружаются следующим образом:
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);
Проблема возникает, когда я пытаюсь сделать в текстуру (пустой один, который не имеет ничего общего с этим первые две из них):
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 ^^");
Как только этот код выполняется, текстура отображается на верхней части цилиндра исчезает и все топ превращается в черный ...
Почему?
Ps: моя задача состоит в том, чтобы отобразить эту третью вынесенное текстуру на верхней части цилиндра, над уже существующей ..
Я не понимаю ... что вы подразумеваете под «текстурой цели»? И как я могу отвязать? – elect
вызовите 'glBindTexture (GL_TEXTURE_2D, 0);' перед вызовом 'glBindFramebuffer'. Если текстура прикрепления FBO привязана к нескольким текстурирующим единицам, вы должны отпереть их для каждого из них. – datenwolf
Это работает, я вижу, что теперь я правильно рисую текстуру .. (с некоторым специальным буфером) Проблема теперь в том, как я могу сделать, чтобы применить две текстуры на одной и той же поверхности: в тот момент, когда я уже сопоставлен check3dFloorTexture на верхней части цилиндра. Я хотел бы добавить это, текстуру, которую я отобразил (и мне нужно будет сделать это с помощью специальной функции смешивания). Как я могу это сделать? – elect