OpenGL函数glDrawBuffers(GLsizei n, const GLenum *bufs)在Qt中是否可用? 我正在尝试将多个渲染目标传递给我的片段着色器,但QtCreator说该函数在此作用域中未声明。 我的想法是创建一个帧缓冲对象,并使用片段着色器将绘制到这两个缓冲区。
已修复: 只需将#define GL_GLEXT_PROTOTYPES 1添加到有问题的文件中即可 :(
OpenGL函数glDrawBuffers(GLsizei n, const GLenum *bufs)在Qt中是否可用? 我正在尝试将多个渲染目标传递给我的片段着色器,但QtCreator说该函数在此作用域中未声明。 我的想法是创建一个帧缓冲对象,并使用片段着色器将绘制到这两个缓冲区。
已修复: 只需将#define GL_GLEXT_PROTOTYPES 1添加到有问题的文件中即可 :(
Qt仅提供对OpenGL函数的基本访问。其中包括加载着色器和纹理。渲染目标不在其中。只需使用适当的扩展加载库,如GLEW。 GLEW将与Qt的功能很好地共存。
从QGLWidget派生并覆盖glInit
以在调用initializeGL
后调用glewInit
我们刚刚花了一些时间来修复这个问题。我们正在运行Qt 5.2.1,使用QGLFormat创建了一个OpenGL3.2上下文,在OSX 10.8和Ubuntu 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);
<OpenGL/gl3.h>
中。请注意使用gl3.h
而不是gl.h
。 - Reto Koradi