2013-08-15 2 views
4

FBO에서 간단한 바둑판을 렌더링 한 다음 glReadPixels()을 수행하려고합니다.FBO + glReadPixels 모두 검정색으로 렌더링하십시오.

FBO가 없으면 모든 것이 정상적으로 작동합니다. 그래서 내 렌더링 함수는 괜찮아 glReadPixels()라고 가정합니다. FBO를 사용하면 FBO 호출이 끝난 후에 그릴 수있는 모든 선을 얻을 수 있습니다.

def renderFBO(): 
    #WhyYouNoWorking(GL_FRAMEBUFFER) # degug function... error checking 
    glBindFramebuffer(GL_DRAW_FRAMEBUFFER, framebuffer) 

    glBindRenderbuffer(GL_RENDERBUFFER, renderbufferA) 
    glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA, window.width, window.height) 

    glBindRenderbuffer(GL_RENDERBUFFER, renderbufferB) 
    glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, window.width, window.height)  

    glBindFramebuffer(GL_DRAW_FRAMEBUFFER, framebuffer) 
    glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, renderbufferA) 
    glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, renderbufferB) 

    #WhyYouNoWorking(GL_FRAMEBUFFER) 

    glDrawBuffer(GL_COLOR_ATTACHMENT0) 
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT) 
    glViewport(0, 0, window.width, window.height) 


    DrawChecker(Nbr = 16, Dark = 25.0/255, Light = 75.0/255) 
    for i in range(len(labelSysInfo)): 
     pyglet.text.Label(labelSysInfo[i], font_name='Times New Roman', font_size=26, x=(window.width*0.68), y= (window.height*0.04*i)+(window.height*2/3), anchor_x='left', anchor_y='center', color = (250, 250, 250, 150)).draw() 

    glReadPixels(0, 0, window.width, window.height, GL_RGBA, GL_UNSIGNED_BYTE, a) 
    glBindFramebuffer(GL_FRAMEBUFFER, 0) 

내 다른 기능 : 메인에서

def on_draw(dt): 
    glDrawBuffer(GL_BACK) 
    glClear(GL_COLOR_BUFFER_BIT) 
    glClearColor(0.0, 0.0, 0.0, 1.0) 
    glLoadIdentity() 
    glEnable(GL_TEXTURE_2D) 


    glDisable(GL_TEXTURE_2D) 
    BlueLine() # draw a simple line. works fine 
    DropFrameTest() # draw a simple line. works fine 

는 renderFBO()에 대한 호출이 다음 번 수행하고, 여기에

내 코드 (파이썬, 목표로 크로스 플랫폼)입니다 on_draw는 주기적으로 호출됩니다.

dt = pyglet.clock.tick() 
renderFBO() 
pyglet.clock.schedule_interval(on_draw, 0.007) 
pyglet.app.run() 

답변

4

프레임 버퍼를 GL_DRAW_FRAMEBUFFER에만 바인딩했습니다. 사용 읽고 같은 FBO와 쓰기 모두에

glBindFramebuffer(GL_FRAMEBUFFER, ... 

glFramebufferRenderbuffer(GL_FRAMEBUFFER, ... 

.

이미 프레임 버퍼 완성도 (glCheckFramebufferStatus)를 확인하고 GL 오류 (glGetError 또는 새 확장자)를 확인하는 것이 매우 유용합니다.

[편집]

첫 번째 프레임에 이미지를 볼 경우,하지만 다음에 어느 것도에서 뒤에 머물 것이이 없어야합니다
(코멘트에서 전술 를 해결 샷건 문제) 이전 프레임.

  • 가장 일반적인 문제는 깊이 버퍼를 지우는 것을 잊는 것입니다.
  • 다음은 스텐실 버퍼와 블렌딩입니다 (두 가지로 시작하지는 않습니다.).
  • 각 프레임에 새 FBO 핸들이 생성되고 실행되지 않았습니까?
  • 또 다른 일반적인 문제는 누적 행렬 변환이지만 glLoadIdentity가 있으므로 문제가 없어야합니다.
+0

시도했지만 작동하지 않았습니다. glCheckFramebufferStatus()를 호출합니다. 도와 주셔서 감사합니다 :) – BaldDude

+0

그것은 파이썬 + gl을 사용했기 때문에 나이가 지났지 만 FBO를 바인딩 해제 한 후에 시도해 볼 수 있습니까? glBindFramebuffer (GL_READ_FRAMEBUFFER, framebuffer); glBindFramebuffer (GL_DRAW_FRAMEBUFFER, 0); glBlitFramebuffer (0, 0, window.width, window.height, 0, 0, window.width, window.height, GL_COLOR_BUFFER_BIT, GL_NEAREST); glBindFramebuffer (GL_READ_FRAMEBUFFER, 0); FBO – jozxyqk

+0

의 내용을 볼 수 있습니다. 내 FBO의 내용을 검증하는 방법을 생각하지 않았습니다. 힌트를 가져 주셔서 감사합니다. 그래서 제가 얻은 것은 FBO가 한 번만 렌더링된다는 것입니다. FBO의 내용을 읽기 전에 내용을 삭제할 것을 제안합니까? – BaldDude