2010-03-31 2 views
1

다각형 오프셋 채우기를 사용하여 은선 제거를 수행하려고합니다. 코드는FBO를 통과 한 후 은선 제거를 성공적으로 수행하려면 어떻게해야합니까?

alt text http://img709.imageshack.us/img709/6930/screenshot1twt.png

코드를 아래와 같이 내가 개체를 그리는 데 사용할 창 버퍼에 직접 렌더링하지만 FBO를 통과 할 때 선을 그리는 데 실패 할 경우 완벽하게 작동

void drawCubes (GLboolean removeHiddenLines) 
{ 
    glLineWidth(2.0); 
    glPushMatrix(); 
    camera.ApplyCameraTransform(); 
    for(int i = 0; i < 50; i ++){ 
    glPushMatrix(); 
     cube[i].updatePerspective(); 
     glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); 
     glColor3f(1.0,1.0,1.0); 
     cube[i].draw(); 
     glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); 

     if(removeHiddenLines){ 
      glEnable(GL_POLYGON_OFFSET_FILL); 
      glPolygonOffset(1.0, 1.0); 
      glColor3f(1.0, 0.0, 0.0); //fill polygons for hidden line removal 
      cube[i].draw(); 
      glDisable(GL_POLYGON_OFFSET_FILL); 
     } 
    glPopMatrix(); 
    } 
    glPopMatrix(); 
} 

이 예에서 첫 번째 패스는 창 버퍼와 FBO 모두에 렌더링을 포함합니다.

void firstPass() 
{ 
    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glViewport(0, 0, fboWidth, fboHeight); 

    glEnable(GL_DEPTH_TEST); 
    glDisable(GL_TEXTURE_2D); 
    drawParticleView(GL_TRUE); 
    glDisable(GL_DEPTH_TEST); 

    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, framebufferID[1]); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glViewport(0, 0, fboWidth, fboHeight); 

    glEnable(GL_DEPTH_TEST); 
    glDisable(GL_TEXTURE_2D); 
    drawParticleView(GL_TRUE); 
    glDisable(GL_DEPTH_TEST); 
} 

두 번째 패스는 FBO를 창 버퍼로 다시 렌더링합니다.

void secondPass() 
{ 
    glEnable(GL_TEXTURE_2D); 

    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); 
    glBindTexture(GL_TEXTURE_2D, renderTextureID[0]); 

    glViewport(fboWidth, 0, fboWidth, fboHeight); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    glBegin(GL_QUADS); 
    glTexCoord2i(0, 0); 
    glVertex2f(-1.0f, -1.0f); 
    glTexCoord2i(1, 0); 
    glVertex2f(1.0f, -1.0f); 
    glTexCoord2i(1, 1); 
    glVertex2f(1.0f, 1.0f); 
    glTexCoord2i(0, 1); 
    glVertex2f(-1.0f, 1.0f); 
    glEnd(); 

    glDisable(GL_TEXTURE_2D); 
} 

설정 FBO의

void setupRC() 
{ 
    setupTextures(); 
    glGenFramebuffersEXT(2, framebufferID); 

    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, framebufferID[0]); 
    glGenRenderbuffersEXT(1, &renderbufferID); 
    glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, renderbufferID); 
    glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT32, fboWidth, fboHeight); 
    glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, renderbufferID); 
    glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, renderTextureID[0], 0); 
    GLenum fboStatus = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); 
    if(fboStatus != GL_FRAMEBUFFER_COMPLETE_EXT){ 
    fprintf(stderr, "FBO #1 Error!"); 
    } 
    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, framebufferID[1]); 
    glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, renderTextureID[1], 0); 
    fboStatus = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); 
    if(fboStatus != GL_FRAMEBUFFER_COMPLETE_EXT){ 
    fprintf(stderr, "FBO #2 Error!"); 
    } 
    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); 
} 

설정 텍스처

void setupTextures(void) 
{ 
    glGenTextures(2, renderTextureID); 

    for (GLint i = 0; i < 2; i++){ 
    glBindTexture(GL_TEXTURE_2D, renderTextureID[i]); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
    // this may change with window size changes 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, fboWidth, fboHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 
    } 
    glBindTexture(GL_TEXTURE_2D, 0); 
} 

두 견해가 동일하지 왜 이해가 안? 나는 뭔가를 놓치고 있는가?
감사합니다.

+0

블렌딩과 관련이 있습니까? 그렇다면 어떻게하면 원하는 결과를 얻을 수 있습니까? – Brett

+0

FBO를 생성하는 코드를 보여줄 수 있습니까? – Stringer

+0

원래 게시물 – Brett

답변

1

문제는 필자가 깊이 부착없이 FBO로 렌더링하고 있다는 것입니다. 두 번째 FBO를 첫 번째 FBO와 동일하게 설정하면 올바른 결과가 나타납니다.

+0

이상한, I는 "; glFramebufferRenderbufferEXT (GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, renderbufferID) glRenderbufferStorageEXT (GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT32, fboWidth, fboHeight)"에 있다고 생각한다. – Luca

+0

안녕하세요. 브렛입니다. 작업 코드를 게시 할 수 있습니까? 정말 고마워. – user1128265

0

코드가 괜찮습니다. 이상한 점은 빨간색 큐브가 그려져 있지만 선은 아닙니다 ... OpenGL 구현, 드라이버 버전은 무엇입니까?

GL_POLYGON_OFFSET_FILL 및/또는 glLineWidth을 사용하지 않고 테스트해도 숨겨진 부분이 보이지만 선이 보이는지 확인할 수 있습니까?

+0

에 설치 코드 추가 OpenGL 버전 문자열 : 2.1.2 NVIDIA 185.18.36. 나는 GL_POLGON_OFFSET_FILL없이 테스트했고 예상대로 숨겨진 선으로 와이어 프레임 큐브를 얻습니다. 또한 glLineWidth없이 시도하고 똑같은 일이 발생합니다. ahve 깊이 버퍼에 충분 – Brett