从SFML切换到GLFW进行窗口管理后,尝试绑定我的vbo会导致OpenGL错误GL_INVALID_OPERATION(1282),详细信息为“缓冲区名称未引用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中,缓冲区对象(名称)值必须由生成(保留)glGenBuffers
。在兼容性配置文件上下文中,这不是必需的。
您错误地尝试通过glGenVertexArrays
而不是生成缓冲区名称glGenBuffers
。
glGenVertexArrays(1, &vbo); glBindBuffer(GL_ARRAY_BUFFER, vbo);
INVALID_OPERATION
当您尝试通过生成缓冲区对象时,这将导致错误glBindBuffer
。
使用glGenBuffers
来解决这个问题:
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
注意,您未指定配置文件类型(glfwWindowHint(GLFW_OPENGL_PROFILE, ...)
),默认情况下GLFW_OPENGL_ANY_PROFILE
,未指定配置文件类型。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句