Картирование нескольких текстур на одной поверхности - PullRequest
0 голосов
/ 09 февраля 2012

Я отрисовываю цилиндр и отображаю две разные текстуры на верхнюю и нижнюю грани.

Обе текстуры загружаются следующим образом:

    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: моя задача - нанести эту третью визуализированную текстуру поверх цилиндра поверх уже существующей..

1 Ответ

1 голос
/ 09 февраля 2012
gl.glBindTexture(GL2.GL_TEXTURE_2D, textureID[0]);
/*... */
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);

Сначала необходимо отсоединить текстуру от цели текстуры, прежде чем кадровый буфер, к которому она была прикреплена, может быть выбран в качестве цели рендеринга. Поскольку вы этого не сделаете, вы не будете ничего визуализировать для этой текстуры, поэтому она будет пустой.

...