OpenTK中GL.DrawElements调用致程序崩溃问题求助
OpenTK + OpenGL 窗口崩溃/绘制无响应问题解决
问题现象
- 使用OpenTK的GLFW和OpenGL封装,测试过x86、x64两种构建版本,NuGet依赖包含
OpenTK.Graphics、OpenTK.Windowing.GraphicsLibraryFramework及Visual Studio自动安装的关联包 - 运行代码后窗口弹出但无响应,数秒后直接崩溃,OpenGL和C#均未输出任何控制台调试信息
- 注释
GL.DrawElements后,窗口能正常显示黑色清屏画面并响应输入,但无法绘制任何内容 - 无论是设置
OpenGlProfile.Core还是OpenGlProfile.Compat,上述问题均会出现 GL.DrawArrays仅在Compat模式下能正常工作
问题根源与解决
问题的核心是顶点属性配置顺序错误:必须先完成顶点缓冲区对象(VBO)的生成、绑定与数据填充,再调用GL.VertexAttribPointer等顶点属性配置方法——此前错误认为该顺序不影响绘制逻辑。
调整代码执行顺序,确保VBO相关操作全部完成后,再配置顶点属性指针并启用顶点属性数组,即可解决崩溃及无法绘制的问题。
代码调整参考
错误顺序(引发崩溃):
// 错误:先配置顶点属性,再创建VBO GL.VertexAttribPointer(0, 3, VertexAttribPointerType.Float, false, 3 * sizeof(float), 0); GL.EnableVertexAttribArray(0); int vbo = GL.GenBuffer(); GL.BindBuffer(BufferTarget.ArrayBuffer, vbo); GL.BufferData(BufferTarget.ArrayBuffer, vertices.Length * sizeof(float), vertices, BufferUsageHint.StaticDraw);
正确顺序:
// 正确:先创建、绑定VBO并填充数据,再配置顶点属性 int vbo = GL.GenBuffer(); GL.BindBuffer(BufferTarget.ArrayBuffer, vbo); GL.BufferData(BufferTarget.ArrayBuffer, vertices.Length * sizeof(float), vertices, BufferUsageHint.StaticDraw); GL.VertexAttribPointer(0, 3, VertexAttribPointerType.Float, false, 3 * sizeof(float), 0); GL.EnableVertexAttribArray(0);
内容的提问来源于stack exchange,提问作者Quinn C.G.
相关产品推荐
相关产品推荐

