glBindBuffer : 缓冲区名称不引用 OpenGL 生成的缓冲区对象
glBindBuffer : Buffer name does not refer to an buffer object generated by OpenGL
从 SFML 切换到 GLFW 以进行 window 管理后,尝试绑定我的 vbo 导致 OpenGL 错误 GL_INVALID_OPERATION (1282),详细信息 "Buffer name does not refer to an buffer object generated by OpenGL"。
我手动检查了我的 vbo,它似乎被赋予了正确的值。
这是我可以使用 glew-2.1.0 和 glfw-3.3.0 生成的工作示例。
if (!glfwInit())
{
return EXIT_FAILURE;
}
std::cout << glfwGetVersionString() << std::endl;
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 6);
glfwWindowHint(GLFW_OPENGL_DEBUG_CONTEXT, GL_TRUE);
auto window = glfwCreateWindow(g_width, g_height, "An Other Engine", nullptr, nullptr);
if (window == nullptr)
{
return EXIT_FAILURE;
}
glfwMakeContextCurrent(window);
if (glewInit() != GLEW_OK)
{
return EXIT_FAILURE;
}
GLint flags;
glGetIntegerv(GL_CONTEXT_FLAGS, &flags);
if (flags & GL_CONTEXT_FLAG_DEBUG_BIT)
{
glEnable(GL_DEBUG_OUTPUT);
glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
glDebugMessageCallback(glDebugOutput, nullptr);
glDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, nullptr, GL_TRUE);
}
GLuint vao;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
GLuint vbo;
glGenVertexArrays(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
在核心配置文件中 OpenGL Context, the buffer object (name) value has to be generated (reserved) by glGenBuffers
。这在兼容性配置文件上下文中不是必需的。
您错误地尝试通过 glGenVertexArrays
而不是 glGenBuffers
生成缓冲区名称。
glGenVertexArrays(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
当您尝试通过 glBindBuffer
生成缓冲区对象时会导致 INVALID_OPERATION
错误。
使用glGenBuffers
解决问题:
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
请注意,您没有指定配置文件类型 (glfwWindowHint(GLFW_OPENGL_PROFILE, ...)
),默认配置文件类型是 GLFW_OPENGL_ANY_PROFILE
而未指定。
从 SFML 切换到 GLFW 以进行 window 管理后,尝试绑定我的 vbo 导致 OpenGL 错误 GL_INVALID_OPERATION (1282),详细信息 "Buffer name does not refer to an buffer object generated by OpenGL"。
我手动检查了我的 vbo,它似乎被赋予了正确的值。
这是我可以使用 glew-2.1.0 和 glfw-3.3.0 生成的工作示例。
if (!glfwInit())
{
return EXIT_FAILURE;
}
std::cout << glfwGetVersionString() << std::endl;
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 6);
glfwWindowHint(GLFW_OPENGL_DEBUG_CONTEXT, GL_TRUE);
auto window = glfwCreateWindow(g_width, g_height, "An Other Engine", nullptr, nullptr);
if (window == nullptr)
{
return EXIT_FAILURE;
}
glfwMakeContextCurrent(window);
if (glewInit() != GLEW_OK)
{
return EXIT_FAILURE;
}
GLint flags;
glGetIntegerv(GL_CONTEXT_FLAGS, &flags);
if (flags & GL_CONTEXT_FLAG_DEBUG_BIT)
{
glEnable(GL_DEBUG_OUTPUT);
glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
glDebugMessageCallback(glDebugOutput, nullptr);
glDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, nullptr, GL_TRUE);
}
GLuint vao;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
GLuint vbo;
glGenVertexArrays(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
在核心配置文件中 OpenGL Context, the buffer object (name) value has to be generated (reserved) by glGenBuffers
。这在兼容性配置文件上下文中不是必需的。
您错误地尝试通过 glGenVertexArrays
而不是 glGenBuffers
生成缓冲区名称。
glGenVertexArrays(1, &vbo); glBindBuffer(GL_ARRAY_BUFFER, vbo);
当您尝试通过 glBindBuffer
生成缓冲区对象时会导致 INVALID_OPERATION
错误。
使用glGenBuffers
解决问题:
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
请注意,您没有指定配置文件类型 (glfwWindowHint(GLFW_OPENGL_PROFILE, ...)
),默认配置文件类型是 GLFW_OPENGL_ANY_PROFILE
而未指定。