调用 glBindImageTexture() 终止程序

问题描述

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

abdetz

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

    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_TEXTURE_MAG_FILTER,GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
    glTexImage2D(GL_TEXTURE_2D,GL_RGBA32F,tex_w,tex_h,GL_RGBA,GL_FLOAT,nullptr);
    glBindImageTexture(0,tex_output,GL_FALSE,GL_WRITE_ONLY,GL_RGBA32F);

一切正常,直到调用最后一个函数。 我已经检查过我的系统确实有 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 扩展入口点。