You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 10:30:54