gpt4 book ai didi

opengl - 渲染到 FBO + glReadPixels 全黑

转载 作者:行者123 更新时间:2023-12-01 01:06:38 27 4
gpt4 key购买 nike

我正在尝试在 FBO 中渲染一个简单的棋盘格,然后执行 glReadPixels()。

当我在没有 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()

最佳答案

猜测一下,您只将帧缓冲区绑定(bind)到 GL_DRAW_FRAMEBUFFER。采用

glBindFramebuffer(GL_FRAMEBUFFER, ...


glFramebufferRenderbuffer(GL_FRAMEBUFFER, ...

使用相同的 FBO 进行读写。

我确定您已经有了,但检查帧缓冲区完整性(glCheckFramebufferStatus)和 GL 错误(glGetError,或新扩展)也非常有用。

[编辑]
(霰弹枪解题技巧 来自评论)

如果您在第一帧上看到图像,但在下一帧中没有图像,则必须有一些东西落后于前一帧。
  • 最常见的问题是忘记清除深度缓冲区 - 但您没有。
  • 接下来是模板缓冲区和混合(看起来它们都没有被启用)。
  • 也许每帧都会生成一个新的 FBO 句柄 你快用完了吗?
  • 另一个常见问题是累积矩阵变换,但你有 glLoadIdentity 所以应该没有问题。
  • 关于opengl - 渲染到 FBO + glReadPixels 全黑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18255082/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com