2012-01-04 6 views
3

텍스쳐를 렌더링하려고 애 쓰고 있지만 약간 문제가 있습니다. 모든 것이 제대로 작동하는지 확인하기 위해 화면에 간단한 쿼드를 렌더링하려고합니다.텍스쳐 문제로 렌더링

target->enable(); 

    glBegin(GL_QUADS); 

    glColor4f(1.f, 0.f, 0.f, 1.f); 
    glVertex3f(0.f, 0.f, 0.f); 

    glColor4f(0.f, 1.f, 0.f, 1.f); 
    glVertex3f(16.f, 0.f, 0.f); 

    glColor4f(0.f, 0.f, 1.f, 1.f); 
    glVertex3f(0.f, 16.f, 0.f); 

    glColor4f(1.f, 1.f, 0.f, 1.f); 
    glVertex3f(16.f, 16.f, 0.f); 

    glEnd(); 

    target->disable(); 

정상적으로 화면에 쿼드를 그릴 때 쿼드는 예상대로 렌더링됩니다. 그러나 렌더링 대상이 활성화 된 쿼드를 그릴 때 쿼드는 화면의 왼쪽 아래 모서리에서 렌더링되고 대상에 렌더링되지 않습니다.

RenderTarget::RenderTarget(GraphicsDevice *graphics, GLuint width, GLuint height) { 

    mWidth = width; 
    mHeight = height; 

    // First create the depth buffer 
    glGenRenderbuffers(1, &mDepth); 
    glBindRenderbuffer(GL_RENDERBUFFER_EXT, mDepth); 

    // Tell OpenGL that this renderbuffer is going to be a depth buffer 
    glRenderbufferStorage(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, mWidth, mHeight); 
    glFramebufferRenderbuffer(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, mDepth); 

    glBindRenderbuffer(GL_RENDERBUFFER_EXT, 0); 

    // Create the frame buffer texture 
    glGenTextures(1, &mTexture); 
    glBindTexture(GL_TEXTURE_2D, mTexture); 

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, mWidth, mHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); 

    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_MAG_FILTER, GL_LINEAR); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 

    glBindTexture(GL_TEXTURE_2D, 0); 

    // Create the frame buffer 
    glGenFramebuffers(1, &mFbo); 
    glBindFramebuffer(GL_FRAMEBUFFER_EXT, mFbo); 

    // Attach the texture 
    glFramebufferTexture2D(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, mTexture, 0); 

    //Attach the depth buffer 
    glFramebufferRenderbuffer(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, mFbo); 

    glBindFramebuffer(GL_FRAMEBUFFER_EXT, 0); 


} 

RenderTarget::~RenderTarget() { 
    glDeleteBuffers(1, &mFbo); 
    glDeleteBuffers(1, &mDepth); 
    glDeleteTextures(1, &mTexture); 
    mFbo = 0; 
    mDepth = 0; 
    mTexture = 0; 
} 

void RenderTarget::enable() { 
    // Bind the frame buffer 
    glBindFramebuffer(GL_FRAMEBUFFER_EXT, mFbo); 
    // store the glViewport and glEnable states 
    //glPushAttrib(GL_VIEWPORT_BIT | GL_ENABLE_BIT); 

    glClearColor(1.f, 0.f, 0.f, 1.f); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glClearColor(0.f, 0.f, 0.f, 0.f); 

    glLoadIdentity(); 
} 

void RenderTarget::disable() { 
    // Restore glViewport and glEnable states 
    glPopAttrib(); 
    glBindFramebuffer(GL_FRAMEBUFFER_EXT, 0); 
} 
+0

FBO가 완전합니까 (http://www.opengl.org/wiki/Framebuffer_Object#Framebuffer_Completeness)? 당신은'glCheckFramebufferStatus()'를 호출하지 않는 것 같습니다. – genpfault

+0

예, GL_FRAMEBUFFER_COMPLETE_EXT (으)로 되돌아 왔습니다. – rcapote

답변

3

. 이것은 사각형이 화면 구석으로 이동하는 이유를 설명합니다.

glPushAttrib에 전화를 걸었지만 glPopAttrib과 일치하는 전화는 주석 처리하지 않았습니다. 다른 곳에서는 glPushAttrib을 사용하지 않으면 오류 플래그를 설정하고 GL 상태 만 남겨 두어야하지만 그 경우는 알 수 없으며 속성 스택이 항상 비어 있다고 가정하는 것이 좋습니다. glBindFrameBuffer에 대한

This 문서는 당신이 첫 번째 인수로 GL_FRAMEBUFFER 또는 GL_DRAW_FRAMEBUFFER를 사용한다고 제안 :

target이 GL_DRAW_FRAMEBUFFER, GL_READ_FRAMEBUFFER 또는 GL_FRAMEBUFFER이어야합니다. 프레임 버퍼 객체가 GL_DRAW_FRAMEBUFFER 또는 GL_READ_FRAMEBUFFER에 바인드 된 경우 해당 객체가 삭제되거나 다른 프레임 버퍼가 해당 바인드 포인트에 바인딩 될 때까지 렌더링 또는 읽기 작업의 대상이됩니다. 대상이 GL_FRAMEBUFFER로 설정된 glBindFramebuffer을 호출하면 framebuffer 이 읽기 ​​및 그리기 프레임 버퍼 대상에 바인딩됩니다.

코드에서 _EXT 접미사가있는 열거 형은 거기에 문서화 된 버전 이전의 OpenGL 버전과 관련이있을 가능성이 큽니다. 자습서는 이와 같은 세부 사항이 오래된 것으로 허용하는 경향이 있습니다.

환경을 확인하십시오. & OpenGL과 일치하는 설명서를 참조하십시오. 어떤 이유로 OpenGL 버전을 쉽게 확인할 수없는 경우 glBindFrameBuffer을 호출 한 후 GL_INVALID_ENUM 오류를 확인하십시오.

2

이 코드는 잘못된 것 같다

//Attach the depth buffer 
glFramebufferRenderbuffer(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, mFbo); 

당신이 여기서 뭘하는 것은 당신이 mFbo에 렌더링 버퍼로 mFbo을 첨부하려고하는 것입니다. 그러나 이미 렌더링 버퍼가 올바르게 연결되어 있습니다 (glFramebufferRenderbuffer()에 대한 첫 번째 호출에서 수행됨). 그 코드를 제거하면 문제가 해결 될 것입니다.

1

제가 생각하기에 제 문제는 glViewport를 설정하고 FBO를 렌더링 할 때 glOrtho를 올바르게 설정하는 것이 었습니다. 이 코드는 정리해야하지만 여기 어떻게 수정 했는가? 귀하가 glLoadIdentity와 현재 행렬 (가장 가능성이 모델 뷰)을 재설정한다 수

void RenderTarget::enable() { 
    // Bind the frame buffer 

    glBindFramebuffer(GL_FRAMEBUFFER_EXT, mFbo); 
    // store the glViewport and glEnable states 
    //glPushAttrib(GL_VIEWPORT_BIT | GL_ENABLE_BIT); 

    glViewport(0, 0, mWidth, mHeight); 
    // projection matrix 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 

    // orthographic projection 
    glOrtho(0, mWidth, 0, mHeight, -1, 1); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    glClearColor(1.f, 0.f, 0.f, 1.f); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glClearColor(0.f, 0.f, 0.f, 0.f); 

    glLoadIdentity(); 
} 

void RenderTarget::disable() { 
    // Restore glViewport and glEnable states 
    //glPopAttrib(); 
    glBindFramebuffer(GL_FRAMEBUFFER_EXT, 0); 
    glViewport(0, 0, 1024, 768); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 

    // orthographic projection 
    glOrtho(0, 1024, 768, 0, -1, 1); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
} 
+0

위에 게시 한 코드에서 매트릭스 모드를 수동으로 일반 설정으로 다시 설정합니다. 스택에 푸시/팝하여이를 수행 할 수있는 방법이 있습니까? 나는 glPushMatrix/glPopMatrix를 시도했으나, 예상대로 작동하지 않는 것 같습니다. – rcapote

+2

'GLPushAttrib'를'GL_TRANSFORM_BIT'로 사용하면 행렬 모드가 다른 상태와 함께 저장됩니다. 자세한 내용은 설명서를 확인하십시오. – 01d55

관련 문제