2012-02-09 4 views
0

저는 실린더를 렌더링하고 두 개의 서로 다른 텍스처를 위쪽과 아래쪽면에 매핑합니다.동일한 표면에 여러 텍스처 매핑

두 텍스처는 다음과 같은 방법으로로드 : 나는 (이 처음 두 사람과는 아무 상관이없는 빈 하나,) 텍스처를 렌더링 할 때

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 ^^"); 

는 즉시이 코드가 실행될 때, 실린더의 상단에 매핑 된 텍스처가 사라지고 모든 상단

왜 ... 검은 색으로 변합니다?

시 : 내 임무는 당신은 전에, 텍스처 대상에서 먼저 텍스처 바인딩을 해제 할 필요가 ... 이미 기존에 걸쳐 실린더의 상단에

답변

1
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); 

을이 세 번째 렌더링 텍스처를 매핑하는 것이다 첨부 된 프레임 버퍼를 렌더링 대상으로 선택할 수 있습니다. 이 작업을 수행하지 않으므로이 텍스처에 아무 것도 렌더링하지 않으므로 빈 상태가됩니다.

+0

나는 그것을 얻지 않는다 ... 당신은 "텍스쳐 타겟"을 어떻게 의미합니까? 어떻게 바인딩을 해제 할 수 있습니까? – elect

+0

'glBindFramebuffer'를 호출하기 전에'glBindTexture (GL_TEXTURE_2D, 0);를 호출하십시오. FBO 색상 첨부 텍스처가 여러 텍스처 단위에 바인딩 된 경우 각 텍스처 단위를 바인딩 해제해야합니다. – datenwolf

+0

작동 중입니다. 이제 질감에 적절하게 렌더링되고 있습니다. (특수 버퍼를 사용하여) 문제는 이제 동일한 표면에 두 개의 텍스처를 적용하는 방법입니다. 실린더 위의 check3dFloorTexture. 이 부분을 추가하고 싶습니다. 렌더링 된 텍스처 (특수 혼합 함수를 사용하여이 작업을 수행해야합니다). 어떻게하면됩니까? – elect

관련 문제