2014-01-18 6 views
-1

FBO에 렌더링 할 때 깊이 테스트가 실패한 것처럼 보입니다. 그렇지 않으면 깊이 작동하지 않습니다. 이상하게도 더 복잡한 버전 (필자는 이것을 테스트하지 않았다)을 학교 컴퓨터에서 테스트했을 때 (FBO 없이도! :-)), 여전히 실패했다.LWJGL FBO - 깊이 테스트가 작동하지 않음 (더 간단한 코드)

불행히도 사진을 게시하려면이 사이트에서 충분한 평판을 얻지 못했기 때문에 링크 here으로 게시 할 예정입니다. (이것은 더 복잡한 것이지만 그 효과는 여전히 동일합니다 (컬러 큐브는이 버전과 동일하게 렌더링됩니다)).

Main.java :

마지막으로, 여기에 코드입니다 - 카메라 및 CamController - 나는 래퍼의 몇 왼쪽

package Main; 


import static org.lwjgl.opengl.GL11.*; 
import static org.lwjgl.opengl.GL12.*; 
import static org.lwjgl.opengl.GL30.*; 
import static org.lwjgl.util.glu.GLU.gluPerspective; 

import java.nio.ByteBuffer; 

import org.lwjgl.LWJGLException; 
import org.lwjgl.input.Keyboard; 
import org.lwjgl.input.Mouse; 
import org.lwjgl.opengl.Display; 
import org.lwjgl.opengl.DisplayMode; 
import org.lwjgl.opengl.GL11; 

public class Main { 
    //This just allows me to move around the scene - it's surely not the cause of the bug... 
    CamController camera; 
    int /*ID of FBO*/fboID, /*Texture FBO will render to*/renderTexture; 

    public Main() { 
     //Init display 
     try { 
      Display.setDisplayMode(new DisplayMode(1280, 720)); 
      Display.setTitle("Example of a fail"); 
      //Display.setVSyncEnabled(true); 
      Display.create(); 
     } catch (LWJGLException e) { 
      e.printStackTrace(); 
     } 
     glEnable(GL_BLEND); 
     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
     glEnable(GL_TEXTURE_2D); 
     setTo3d(); 
     glMatrixMode(GL_MODELVIEW); 
     glLoadIdentity(); 
     Mouse.setGrabbed(true); 
     //Tested it with, and without this... 
     glClearDepth(1); 
     glEnable(GL_DEPTH_TEST); 
     glShadeModel (GL_SMOOTH);         // Select Smooth Shading 
     glHint (GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); 
     init(); 
     initFBO(); 
     loop(); 
    } 
    /**Initiates any objects I use.*/ 
    public void init(){ 
     camera = new CamController(); 
    } 
    public void initFBO(){ 
     renderTexture = createTexture(1280, 720, false); 
     fboID = glGenFramebuffers(); 
     glBindFramebuffer(GL_FRAMEBUFFER, fboID); 
     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, renderTexture, /*Mipmap Level*/0); 
     int i = glCheckFramebufferStatus(GL_FRAMEBUFFER); 
     if(i != GL_FRAMEBUFFER_COMPLETE){ 
      System.err.println("Framebuffer is not working! Fault: "+org.lwjgl.util.glu.GLU.gluErrorString(i)); 
     } 
     glBindFramebuffer(GL_FRAMEBUFFER, 0); 
    } 
    /*Main running loop*/ 
    public void loop(){ 
     while(!Display.isCloseRequested() && !Keyboard.isKeyDown(Keyboard.KEY_ESCAPE)){ 
      glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); 
      //Checks the keyboard, and mouse to move camera 
      camera.update(); 
      setTo3d(); 
      //Rotates and translates the image to camera's perspective. 
      camera.camera.lookThrough(); 
      glBindTexture(GL_TEXTURE_2D, 0); 
      glBindFramebuffer(GL_FRAMEBUFFER, fboID); 

      glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); 
      draw(); 

      glBindFramebuffer(GL_FRAMEBUFFER, 0); 
      setTo2d(); 
      drawFBO(); 
      Display.update(); 
      glFlush(); 
      Display.sync(60); 
     } 
     Display.destroy(); 
     System.exit(0); 
    } 
    /*Draws objects to FBO - I can use VBOs, but was just saving time.*/ 
    public void draw(){ 
     glBegin(GL_QUADS);    
     glColor3f(0.0f, 1.0f, 0.0f);  
     glVertex3f(1.0f, 1.0f, -1.0f); 
     glVertex3f(-1.0f, 1.0f, -1.0f); 
     glVertex3f(-1.0f, 1.0f, 1.0f); 
     glVertex3f(1.0f, 1.0f, 1.0f); 

     glColor3f(1.0f, 0.5f, 0.0f);  
     glVertex3f(1.0f, -1.0f, 1.0f); 
     glVertex3f(-1.0f, -1.0f, 1.0f); 
     glVertex3f(-1.0f, -1.0f, -1.0f); 
     glVertex3f(1.0f, -1.0f, -1.0f); 

     glColor3f(1.0f, 0.0f, 0.0f);  
     glVertex3f(1.0f, 1.0f, 1.0f); 
     glVertex3f(-1.0f, 1.0f, 1.0f); 
     glVertex3f(-1.0f, -1.0f, 1.0f); 
     glVertex3f(1.0f, -1.0f, 1.0f); 

     glColor3f(1.0f, 1.0f, 0.0f);  
     glVertex3f(1.0f, -1.0f, -1.0f); 
     glVertex3f(-1.0f, -1.0f, -1.0f); 
     glVertex3f(-1.0f, 1.0f, -1.0f); 
     glVertex3f(1.0f, 1.0f, -1.0f); 

     glColor3f(0.0f, 0.0f, 1.0f);  
     glVertex3f(-1.0f, 1.0f, 1.0f); 
     glVertex3f(-1.0f, 1.0f, -1.0f); 
     glVertex3f(-1.0f, -1.0f, -1.0f); 
     glVertex3f(-1.0f, -1.0f, 1.0f); 

     glColor3f(1.0f, 0.0f, 1.0f);  
     glVertex3f(1.0f, 1.0f, -1.0f); 
     glVertex3f(1.0f, 1.0f, 1.0f);  
     glVertex3f(1.0f, -1.0f, 1.0f); 
     glVertex3f(1.0f, -1.0f, -1.0f); 
     glEnd();       
     glColor3f(1,1,1); 
    } 

    //Draws the FBO rect - Again, can use VBOs, just saving time... 
    public void drawFBO(){ 
     glBindTexture(GL_TEXTURE_2D, renderTexture); 
     glLoadIdentity(); 
     glBegin(GL_QUADS); 
      glTexCoord2f(0,0); 
      glVertex2f(0,0); 
      glTexCoord2f(1,0); 
      glVertex2f(1280,0); 
      glTexCoord2f(1,1); 
      glVertex2f(1280,720); 
      glTexCoord2f(0,1); 
      glVertex2f(0,720); 
     glEnd(); 
    } 

    public static void main(String[] args) {  
     new Main(); 
    } 
    /*I know there are better ways of doing this, but I'm doing it this way for the sake of time...*/ 
    public void setTo2d(){ 
     glMatrixMode(GL_PROJECTION); 
     glLoadIdentity(); 
     glOrtho(0, 1280, 0, 720, 1, -1); 
     glMatrixMode(GL_MODELVIEW); 
     glLoadIdentity(); 
    } 
    public void setTo3d(){ 
     glMatrixMode(GL_PROJECTION); 
     glLoadIdentity(); 
     //The problem is not caused by too small a zNear value - I've already tested that... 
     gluPerspective(/*FOV in degrees*/30f, /*Aspect ratio*/ 1280f/720f, /*zNear*/ 0.001f, /*zFar*/50000); 
     glMatrixMode(GL_MODELVIEW); 
     glLoadIdentity(); 
    } 

    //This code taken from TheCPlusPlusGuy, so should work 
    public int createTexture(int w, int h, boolean isDepth){ 
     int handle; 
     handle = glGenTextures(); 
     glBindTexture(GL_TEXTURE_2D, handle); 
     if(isDepth){ 
      GL11.glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, w, h, 0, GL_DEPTH_COMPONENT, GL_FLOAT, (ByteBuffer) null); 
     }else{ 
      GL11.glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, w, h, 0, GL_RGBA, GL_FLOAT, (ByteBuffer) null); 
     } 
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_NEAREST); 
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_NEAREST); 
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
     glBindTexture(GL_TEXTURE_2D, 0); 
     return handle; 
    } 
} 

참고 그들은 단지 당신이 glTranslate로 이동할 수() 및 glRotate()

답변

2

깊이 버퍼없이 FBO를 크래킹하므로 깊이 테스트는 물론 작동하지 않습니다. 당신은 몇 가지 깊이 렌더링 가능한 형식으로 Renderbuffer를 작성하고 다음과 같이 GL_DEPTH_ATTACHMENT로 첨부해야합니다

GLuint depthbuffer; 
glGenRenderbuffers(1, &depthbuffer); 
glBindRenderbuffer(GL_RENDERBUFFER, depthbuffer); 
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, wisth, height); 
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthbuffer); 

widthheight은 물론, 컬러 버퍼의 크기와 일치 schould.

+0

작동합니다! 도와 주셔서 감사합니다! 나는 (인터넷에서) 비슷한 일을 시도했지만, glFramebufferRenderbuffer()를 사용하지 않았다고 생각하고 아마 버퍼를 바인딩 한 후에 그것을 추가했다. – Superdavo

관련 문제