Qt5 - glTexStorage2D/glBindImageTexture 未定义?
Qt5 - glTexStorage2D/glBindImageTexture undefined?
我正在将 Qt 5.7.0 与 OpenGL 4.4 一起使用,并且我正在尝试移植一些旧代码以与 Qt 一起使用。据我所知,Qt 没有自己的方式来处理着色器纹理,所以我使用以下代码在我的 GLEW 非 Qt 项目中运行良好:
float* data = new float[IMAGE_WIDTH * IMAGE_HEIGHT];
for (int i = 0; i < IMAGE_WIDTH * IMAGE_HEIGHT; ++i)
data[i] = 0.f;
GLuint tex[1];
glGenTextures(1, tex);
glBindTexture(GL_TEXTURE_2D, tex[0]);
glTexStorage2D(GL_TEXTURE_2D, 1, GL_R32F, IMAGE_WIDTH, IMAGE_HEIGHT);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, IMAGE_WIDTH, IMAGE_HEIGHT, GL_RED, GL_FLOAT, data);
glBindImageTexture(0, tex[0], 0, GL_FALSE, 0, GL_READ_WRITE, GL_R32F);
delete[] data;
但是显然 glTexStorage2D
和 glBindImageTexture
是未定义的。我看过文档,它们应该存在。我已经尝试 #include
ing QOpenGLFunctions_4_4_Core
、QOpenGLFunctions_4_2_Core
、QOpenGLTexture
和 QOpenGLFunctions
,但是 none 已经解决了问题。我什至查看了 QOpenGLFunctions_4_4_Core
:
的来源
inline void QOpenGLFunctions_4_4_Core::glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
{
d_4_2_Core->f.TexStorage2D(target, levels, internalformat, width, height);
}
即使创建实例也会出现错误:
QOpenGLFunctions_4_4_Core gl;
gl.glTexStorage2D((GL_TEXTURE_2D, 1, GL_R32F, IMAGE_WIDTH, IMAGE_HEIGHT);
与 "Exception thrown: read access violation. this->d_4_2_Core was nullptr."
一起崩溃
有什么方法可以解决这个问题吗?或者更好的是 b) 一种 Qt 方法来做图像 load/store?
您应该通过 QOpenGLContext::versionFunctions()
获取指向 QOpenGLFunctions_4_4_Core
对象的指针。或者,您可以创建自己的对象,但是必须使用 initializeOpenGLFunctions()
成员函数手动加载函数指针,而上下文是当前的。
继承对我有用的功能的特定版本。
class MyWidget: public QOpenGLWidget, protected QOpenGLFunctions_4_4_Core
{
...
}
我正在将 Qt 5.7.0 与 OpenGL 4.4 一起使用,并且我正在尝试移植一些旧代码以与 Qt 一起使用。据我所知,Qt 没有自己的方式来处理着色器纹理,所以我使用以下代码在我的 GLEW 非 Qt 项目中运行良好:
float* data = new float[IMAGE_WIDTH * IMAGE_HEIGHT];
for (int i = 0; i < IMAGE_WIDTH * IMAGE_HEIGHT; ++i)
data[i] = 0.f;
GLuint tex[1];
glGenTextures(1, tex);
glBindTexture(GL_TEXTURE_2D, tex[0]);
glTexStorage2D(GL_TEXTURE_2D, 1, GL_R32F, IMAGE_WIDTH, IMAGE_HEIGHT);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, IMAGE_WIDTH, IMAGE_HEIGHT, GL_RED, GL_FLOAT, data);
glBindImageTexture(0, tex[0], 0, GL_FALSE, 0, GL_READ_WRITE, GL_R32F);
delete[] data;
但是显然 glTexStorage2D
和 glBindImageTexture
是未定义的。我看过文档,它们应该存在。我已经尝试 #include
ing QOpenGLFunctions_4_4_Core
、QOpenGLFunctions_4_2_Core
、QOpenGLTexture
和 QOpenGLFunctions
,但是 none 已经解决了问题。我什至查看了 QOpenGLFunctions_4_4_Core
:
inline void QOpenGLFunctions_4_4_Core::glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
{
d_4_2_Core->f.TexStorage2D(target, levels, internalformat, width, height);
}
即使创建实例也会出现错误:
QOpenGLFunctions_4_4_Core gl;
gl.glTexStorage2D((GL_TEXTURE_2D, 1, GL_R32F, IMAGE_WIDTH, IMAGE_HEIGHT);
与 "Exception thrown: read access violation. this->d_4_2_Core was nullptr."
一起崩溃有什么方法可以解决这个问题吗?或者更好的是 b) 一种 Qt 方法来做图像 load/store?
您应该通过 QOpenGLContext::versionFunctions()
获取指向 QOpenGLFunctions_4_4_Core
对象的指针。或者,您可以创建自己的对象,但是必须使用 initializeOpenGLFunctions()
成员函数手动加载函数指针,而上下文是当前的。
继承对我有用的功能的特定版本。
class MyWidget: public QOpenGLWidget, protected QOpenGLFunctions_4_4_Core
{
...
}