调用 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
扩展入口点。
我的目标是通过 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
扩展入口点。