【问题标题】:Low-resolution Framebuffer repeats itself低分辨率帧缓冲区重复自身
【发布时间】:2020-11-11 12:45:14
【问题描述】:

我创建了一个具有复古风格显示的低分辨率帧缓冲区对象。

帧缓冲区似乎会显示自己,导致屏幕底部出现混乱的像素。

This is how it looks when framebuffer is drawn completely overlapping the viewport

This is how it looks when framebuffer is drawn in overlapping the quarter of the viewport

这就是我制作帧缓冲区和渲染缓冲区的方式

FBO = glGenFramebuffers(1)
DBO = glGenRenderbuffers(1)

glBindRenderbuffer(GL_RENDERBUFFER, DBO)
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, 1280, 720)

glBindFramebuffer(GL_FRAMEBUFFER, FBO)
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, DBO)
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0)

这是主循环中的代码

    glDrawElements(GL_TRIANGLES, len(indices), GL_UNSIGNED_INT, None) # Drawing Stuff

    ###

    glBindFramebuffer(GL_FRAMEBUFFER, 0)
    
    glBlitFramebuffer(
        640 - 128,
        360 - 72,
        640 + 128,
        360 + 72,
        0,
        0,
        1280,
        720,
        GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT,
        GL_NEAREST
    )

我正在使用 Python 3 和 PyOpenGL

【问题讨论】:

  • 如果glBlitFramebuffer 调用的源矩形和目标矩形不重叠会怎样?这是否给出了预期的结果?
  • 我不太明白你的意思。我是 OpenGL 新手,我正在学习它。
  • 首先,为什么要复制帧缓冲区而不是直接直接渲染到屏幕上?其次需要通过 glViewport khronos.org/registry/OpenGL-Refpages/gl4/html/glViewport.xhtml 修改视口
  • 什么是“复制”帧缓冲区?你的意思是我要对帧缓冲区进行两次传输?如果是这样,原因是我试图用第一个 blit 减小立方体的大小,然后在第二个 blit 中增加它。如果我只做第二个,它可以正常工作(它仍然会重复自己),但在这种情况下,我需要在立方体缩放时添加额外的翻译。
  • 另外,这可能是驱动程序问题吗?这篇文章 (stackoverflow.com/questions/41413021/…) 说英特尔驱动程序存在问题。我也在使用英特尔驱动程序。此外,更改渲染缓冲区尺寸并没有带来任何变化。

标签: opengl framebuffer


【解决方案1】:

在这个问题的 cmets 中,有关于驱动程序错误的猜测。不是这种情况。正确 OpenGL 行为的一个明确来源是OpenGL specification,当前 GL 4.6 规范在第 18.3 节“复制像素”(强调我的)中声明:

几个命令在帧缓冲区的区域之间复制像素数据 (参见第 18.3.1 节),或者在纹理区域和渲染缓冲区之间 (见第 18.3.2 节)。 对于所有此类命令,如果源和目标相同或者是相同底层纹理图像的不同视图,如果 源区域和目标区域在该帧缓冲区中重叠, 渲染缓冲区或纹理图像,复制产生的像素值 操作未定义

请注意,绑定目标GL_FRAMEBUFFERGL_READ_FRAMEBUFFER *(定义blit 的源)和GL_DRAW_FRAMEBUFFER(指定目标)的快捷方式,因此您在此处有意创建反馈循环。

但是,仍然完全不清楚您在做什么。从默认帧缓冲区到默认帧缓冲区的 blit 意味着它根本不会显示您的 FBO 的内容,并且由于您的 FBO 没有颜色附件,因此您无法将颜色数据渲染给它。

【讨论】:

    猜你喜欢
    • 2013-05-20
    • 1970-01-01
    • 1970-01-01
    • 2018-02-03
    • 1970-01-01
    • 2014-08-31
    • 1970-01-01
    • 2016-02-16
    • 2014-12-05
    相关资源
    最近更新 更多