2012-02-09 9 views
0

私は円筒をレンダリングし、2つの異なるテクスチャを上端と下端にマッピングします。複数のテクスチャを同じ面にマッピングする

テクスチャは次のようにロードされます両方:

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

私は(この最初の二つのものとは何の関係もない空白の1、)テクスチャにレンダリングしようとすると問題が発生:

すぐにこのコードが実行されるよう
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

それは働いている、私は今、私はテクスチャ上で適切にレンダリングしていることがわかります。(いくつかの特別なバッファを使って) 問題は今、同じサーフェスに2つのテクスチャを適用する方法です。シリンダーの上部のcheck3dFloorTexture。私はこれに、レンダリングしたテクスチャを追加したい(と私はいくつかの特殊なブレンド機能でこれを行う必要があります)。 どうすればいいですか? – elect

関連する問題