调用 glBindImageTexture() 终止程序

Calling glBindImageTexture() terminates program

我的目标是通过 C++ 和 OpenGL 使用计算着色器。 问题是当我在创建和初始化纹理后调用 glBindImageTexture() 时,它只是终止程序。我试着到处检查可能是罪魁祸首,但我无法追溯。 我使用 glfw 作为我的 window 和上下文管理器,并且很高兴 (Core 4.6) 作为 OpenGL 的包装器。 代码的(在我看来)相关部分如下:

    int tex_w = 512, tex_h = 512;
    GLuint tex_output;
    glGenTextures(1, &tex_output);
    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, tex_output);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, tex_w, tex_h, 0, GL_RGBA, GL_FLOAT,
     nullptr);
    glBindImageTexture(0, tex_output, 0, GL_FALSE, 0, GL_WRITE_ONLY, GL_RGBA32F);

这是我用来编译程序的命令(我在 windows、64 位上使用 MinGW):

g++ *.cpp *.c -o bin/main.exe -Iinclude -Llib -lmingw32 -lglfw3 -lopengl32 -lgdi32 -luser32

一切正常,直到调用最后一个函数。 我已经检查过我的系统确实有 OpenGL 4.6(至少检查员是这么告诉我的),所以它也应该有 glBindImageTexture。如果您认为问题不是出在这部分,这里是我到那时为止的所有代码:https://pastebin.com/AYFaWpfL

glBindImageTexture() 仅适用于 GL 4.2+。但是您正在请求 GL 3.3 上下文:

...
glfwInit();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
GLFWwindow* window = glfwCreateWindow(800, 600, "Hello", nullptr, nullptr);
...

如果要使用 glBindImageTexture(),请请求 4.2+ 上下文。

或者如果您想继续使用 GL 3.3 代码,请使用 ARB_shader_image_load_store 扩展入口点。