在Qt中使用OpenGL的glDrawBuffers()函数?

4

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

已修复: 只需将#define GL_GLEXT_PROTOTYPES 1添加到有问题的文件中即可 :(


如果您已经使片段着色器等正常工作,则必须拥有某种扩展加载代码。创建上下文时您获得了哪个GL版本? - Nicol Bolas
@Nicol:glGetString(GL_VERSION) 给了我 "3.3.0 NVIDIA 295.40"。GL 上下文是使用 QGLWidget 的 makeCurrent() 设置的。如果我移除 FBO,着色器可以完美地工作(即使用默认窗口颜色缓冲区)。 - Sebastian Mendez
你正在使用什么来加载你的OpenGL函数? - Nicol Bolas
我的小部件类继承自QGLWidget,现在还继承了QGLFunctions(用于Framebuffer函数)。除此之外,我只是从QtOpenGL.h中导入。所有用于绑定、链接等着色器和其他gl函数的函数都可以直接使用,唯一的问题是glDrawBuffers()。 - Sebastian Mendez
2个回答

1

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

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


谢谢,经过几个小时的尝试,我发现自己犯了一个非常愚蠢的错误:我忘记了 #define GL_GLEXT_PROTOTYPES 1,这样扩展接口就能对 nVidia 可见了,现在问题已经解决了,不需要 GLEW,无论如何还是非常感谢。 - Sebastian Mendez

0

我们刚刚花了一些时间来修复这个问题。我们正在运行Qt 5.2.1,使用QGLFormat创建了一个OpenGL3.2上下文,在OSX 10.8Ubuntu 14.04上运行(很抱歉没有WINDOWS经验)。

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

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

另一方面,在Linux上,我们必须包含两者都:

#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(你可以在线下载此头文件)时才有用。

1
小修正:在OS X上,OpenGL 3.2函数定义在<OpenGL/gl3.h>中。请注意使用gl3.h而不是gl.h - Reto Koradi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接