2013-08-15 3 views
4

Я пытаюсь сделать простую шахматную доску в FBO, а затем сделать glReadPixels().Render to FBO + glReadPixels all black

Когда я делаю это без FBO, все работает нормально. Поэтому я предполагаю, что моя функция рендеринга в порядке, а также glReadPixels(). С FBO все, что я получаю, это линии, которые я рисую после того, как были сделаны призывы к FBO.

Вот мой код (Python, с целью кроссплатформенный):

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. Используйте

glBindFramebuffer(GL_FRAMEBUFFER, ... 

и

glFramebufferRenderbuffer(GL_FRAMEBUFFER, ... 

для чтения и записи с тем же FBO.

Уверен, что у вас уже есть проверка целостности фреймбуфера (glCheckFramebufferStatus) и ошибок GL (glGetError, или новое расширение) также очень полезно.

[EDIT]
(Ружье решение проблем тактики от комментариев)

Если вы видите изображение на первом кадре, но ни на следующий, не должно быть что-то остаться позади от предыдущий кадр.

  • Самая распространенная проблема заключается в том, чтобы забыть очистить буфер глубины, но у вас его нет.
  • Далее следуют буферы и смешивание трафарета (ни одно из них не похоже на то, что они включены).
  • Возможно, новая рукоятка FBO генерируется каждый кадр, и у вас заканчивается?
  • Другой распространенной проблемой является накопление матричных преобразований, но у вас есть glLoadIdentity, поэтому здесь не должно быть никаких проблем.
+0

Пробовал, но это не сработало. Я вызываю glCheckFramebufferStatus(). Спасибо за вашу помощь :) – BaldDude

+0

Прошло много времени с тех пор, как я использовал python + 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

Смежные вопросы