Я пытаюсь сделать простую шахматную доску в 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()
Пробовал, но это не сработало. Я вызываю glCheckFramebufferStatus(). Спасибо за вашу помощь :) – BaldDude
Прошло много времени с тех пор, как я использовал 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
Отлично! Я не понял, как проверить содержание моего FBO. Спасибо за подсказку. Поэтому я получаю от этого то, что мой FBO отображается только один раз. Означает ли это, что я очищаю содержимое своего FBO до того, как прочитаю его? – BaldDude