-2

我的目标是通过 C++ 和 OpenGL 使用计算着色器。问题是,当我在创建和初始化纹理后调用 glBindImageTexture() 时,它只会终止程序。我试着到处检查可能是罪魁祸首,但我无法追溯。我使用 glfw 作为我的窗口和上下文管理器,并很高兴(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 上使用 MinGW,64 位):

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

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

4

1 回答 1

2

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().

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

于 2021-04-12T03:33:23.563 回答