Intel和Nvidia之间的OpenGL fbo blitting不一致

Posted

技术标签:

【中文标题】Intel和Nvidia之间的OpenGL fbo blitting不一致【英文标题】:OpenGL fbo blitting inconsistent between Intel and Nvidia 【发布时间】:2013-01-06 08:00:10 【问题描述】:

我正在将 OpenGL 中的低分辨率场景渲染到帧缓冲区中。然后我打算把这个版本画到整个屏幕上(用 GL_NEAREST 放大)。我使用纹理 blitting (glBlitFramebuffer) 来做到这一点。在我的 Nvidia GPU 上这可以工作,但是在我的 Intel i7 集成显卡上执行完全相同的代码时,目标帧缓冲区上的 y 位置似乎是错误的(即图像渲染得太远了)。

glGetError 不返回错误。由于 Nvidia 驱动程序往往非常宽容,我希望我在 OpenGL 规范中遗漏了一个 Nvidia 不关心的小细节。我搜索了互联网和***,找不到描述的类似问题。两个驱动程序都报告支持 OpenGL 3.0

我的绘图代码:

//setup viewport for small image
glPushAttrib(GL_VIEWPORT_BIT);
glViewport(0, 0, image.getWidth(), image.getHeight());

//bind small framebuffer
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo);
glDrawBuffers(GL_COLOR_ATTACHMENT0);
glClear(GL_COLOR_BUFFER_BIT);

//draw
renderRotatedFull(1);//nothing interesting at all happening here

//reset Viewport
glPopAttrib();

//prepare and execute blitting
glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo);
glReadBuffer(GL_COLOR_ATTACHMENT0);

glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
glDrawBuffers(GL_BACK_LEFT);

glBlitFramebuffer(0, 0, image.getWidth(), image.getHeight(), 0, 0, Game.width,
    Game.height, GL_COLOR_BUFFER_BIT, GL_NEAREST);

glBindFramebuffer(GL_FRAMEBUFFER, 0);

//throws exception if there is an OpenGL error
org.lwjgl.opengl.Util.checkGLError();

初始化如下:

fbo =glGenFramebuffers();
glBindFramebuffer(GL_FRAMEBUFFER, fbo);

rbo = glGenRenderbuffers();
glBindRenderbuffer(GL_RENDERBUFFER, rbo);
glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, image.getWidth(), image.getHeight());
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo);

assert(glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE);

【问题讨论】:

如果有帮助,请尝试将 image.Width() 和 image.Height() 设置为平方和 2 的幂。 (英特尔 GL 驱动程序更可能是一团糟,因为您的代码没问题,而英特尔显卡自己搞砸了)。还要检查内存泄漏,intel GL 驱动程序对它非常敏感。 你的操作系统是什么?这里默认fbo的pixelformat是什么? 我看不出代码有什么问题...但如果您附上英特尔/NVidia 卡的图像可能会有所帮助。 我唯一知道的是英特尔 OpenGL 驱动程序并不是最好的状态。 不完全确定,但 glPixelStore 相关?我记得在不同系统上遇到了与 glPixelStore 相关的帧缓冲区相关问题,但我不确定它是否与 glBlit 相关。 【参考方案1】:

这可能是英特尔核芯显卡的一个已知问题。在这里查看这个程序 - http://www.realtech-vr.com/glview/download.php

这个程序告诉你你的显卡支持什么版本的OpenGL,有时Intel HD只支持1.1(我知道很奇怪!)但有时它可以说它支持更高但有错误。

祝你好运!

【讨论】:

英特尔驱动程序显然支持扩展,它只是做(稍微)错误。随机下载链接也无助于理解问题。 你想怎么看都可以,对我做错了不支持,我不在乎他们说什么。而那个“随机”下载链接是一个工具,它告诉你你的系统“正确”支持什么 OpenGL,以及它是否有任何问题。下次给我负面反馈之前,你为什么不先看看它。

以上是关于Intel和Nvidia之间的OpenGL fbo blitting不一致的主要内容,如果未能解决你的问题,请参考以下文章

在 OpenGL 中处理 FBO 的最佳方法是啥?

Intel/AMD C++ 上的 OpenGL 3+ 失败

如何使Nvidia成为默认显卡?

OpenGL:使用 FBO 和视口偏移问题渲染到纹理

使用 FBO 和着色器 OpenGL 渲染到纹理

在计算机上使用 OpenGL 绘制 FBO 挂起