低分辨率帧缓冲区重复自身

问题描述

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

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

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)

这是mainloop中的代码

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

    ###

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

我正在将Python 3与PyOpenGL一起使用

解决方法

在对该问题的评论中,有关于驱动程序错误的推测。不是这种情况。正确的OpenGL行为的一个权威来源是OpenGL specification,以及第18.3节“复制像素”(强调我的内容)中当前的GL 4.6规范状态:

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

请注意,绑定目标GL_FRAMEBUFFERGL_READ_FRAMEBUFFER *(用于定义blit的源)和GL_DRAW_FRAMEBUFFER(用于指定目标)的快捷方式,因此您正在创建故意在这里建立反馈循环。

但是,仍然不清楚您在做什么。从默认帧缓冲区到默认帧缓冲区的变暗意味着它根本不会显示FBO的内容,并且由于FBO idoes没有颜色附件,因此无法在其上呈现颜色数据。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...