Qt中的OpengL glDrawBuffers()?

Posted

技术标签:

【中文标题】Qt中的OpengL glDrawBuffers()?【英文标题】:OpengGL glDrawBuffers() in Qt? 【发布时间】:2012-05-13 18:57:59 【问题描述】:

OpenGL 函数 glDrawBuffers(GLsizei n, const GLenum *bufs) 在 Qt 中可用吗? 我正在尝试将多个渲染目标传递给我的片段着色器,QtCreator 说该函数未在此范围内声明。这个想法是有一个带有两个颜色缓冲区的帧缓冲区对象,并使用片段着色器绘制到这两个缓冲区。

固定: 只需将#define GL_GLEXT_PROTOTYPES 1 添加到有问题的文件中:(

【问题讨论】:

如果你有片段着色器和这样的工作,那么你必须有某种扩展加载代码。当你创建你的上下文时,你得到了什么 GL 版本? @Nicol:glGetString(GL_VERSION) 给了我“3.3.0 NVIDIA 295.40”。 GL 上下文是使用 QGLWidget 中的 makeCurrent() 设置的。如果我删除 FBO,着色器可以完美工作(即使用默认窗口颜色缓冲区) 你用什么来加载你的 OpenGL 函数? 我的小部件类继承了 QGLWidget,现在继承了 QGLFunctions(用于 Framebufferfunctions)。除此之外,我只是从 QtOpenGL.h 导入所有用于绑定、链接等着色器的函数,以及其他 gl 函数开箱即用,唯一的问题是 glDrawBuffers()。 【参考方案1】:

Qt 仅提供对 OpenGL 函数的基本访问。加载着色器和纹理就是其中之一。渲染目标不是。只需使用适当的扩展加载程序库,如 GLEW。 GLEW 将与 Qt 的功能很好地共存。

从QGLWidget派生并覆盖glInit以在调用glewInit后调用initializeGL

【讨论】:

谢谢,经过几个小时的尝试,我发现我犯了一个非常愚蠢的错误:我忘记了 #define GL_GLEXT_PROTOTYPES 1 以便扩展接口对 nVidia 可见,现在一切都解决了,没有需要 GLEW,非常感谢【参考方案2】:

我们只是花了一些时间来解决这个问题。我们在 OSX 10.8Ubuntu 14.04 上运行 Qt 5.2.1(抱歉没有 WINDOWS 体验)并创建了 OpenGL3.2 使用 QGLFormat 的上下文。

OSX 中没有问题,因为所有 OpenGL3.2 函数(设置制服、绘制缓冲区等)都定义在:

#include "OpenGL/gl3.h" ///< already included by Qt.. so nothing to do

另一方面,在 Linux 上,我们必须包含以下 BOTH

#include "GL/gl.h"
#include "GL/glext.h" ///< not included by Qt!!! manually include it

我们还尝试让我们的 QGLWidget 类继承自 QGLFunctions_3_2_Core(这个类定义了它自己的 glDrawBuffer 副本等...),但这没有用,而且只是导致段错误

Program received signal SIGSEGV, Segmentation fault. 0x0000000000407068 
in glGetUniformLocation (this=0xbc5820, name=0x407cd0 "view_projection", program=1) 
at /usr/include/qt5/QtGui/qopenglfunctions_3_2_core.h:1075 1075     
return d_2_0_Core->GetUniformLocation(program, name);

我们还研究了上面的“#define GL_GLEXT_PROTOTYPES 1”,但这仅在我们使用 glcorearb.h 时有用(您可以在线下载此标头)。

【讨论】:

小修正:在 OS X 上,OpenGL 3.2 函数在&lt;OpenGL/gl3.h&gt; 中定义。注意gl3.h 而不是gl.h

以上是关于Qt中的OpengL glDrawBuffers()?的主要内容,如果未能解决你的问题,请参考以下文章

Qt 5.6 中的 Opengl

QML 可以替代 Qt 中的 OpenGL 吗?

Qt/OpenGL 小部件中的显示损坏

Qt 4 中的 OpenGL 更新率

Qt 中的 OpenGL 多线程,glGet* 结果的问题

MS Windows 中的 QT 和原生 OpenGL 支持