4

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

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

4

2 回答 2

1

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

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

于 2012-05-13T20:52:00.867 回答
0

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

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

#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时有用(您可以在线下载此标头)。

于 2014-09-02T13:12:48.780 回答