OpenGL glBufferStorage 崩溃

Posted

技术标签:

【中文标题】OpenGL glBufferStorage 崩溃【英文标题】:OpenGL glBufferStorage crashes 【发布时间】:2016-01-29 22:33:13 【问题描述】:

每当我调用 glBufferStorage(...) 时,后续的 glBindBuffer(..) 总是崩溃。例如:

    glBindBuffer(GL_SHADER_STORAGE_BUFFER, 1);
    glBufferStorage(GL_SHADER_STORAGE_BUFFER, sizeof(unsigned int) * 100, NULL, GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT | GL_MAP_READ_BIT );

    glBindBuffer(GL_SHADER_STORAGE_BUFFER, 2); //  <- CRASH HERE!

如果我删除 glBufferStorage(...) 调用,后续 glBindBuffer 调用不会崩溃!

此代码在 GTX650 Ti 和 PhenonII x6 下的我的桌面上正常运行,openGl 通过 NugeT 在 VS2015 上安装(nupengl.core 包)。然后我将整个项目文件夹粘贴到我的笔记本电脑(GeForce 740M / i7),删除了 openGl nuget 包并重新安装。

如何继续调查问题所在?这是逻辑错误还是 gpu 驱动错误?

【问题讨论】:

检查以确保您正确使用该函数(所有标志是否正确)并确保它不是您的硬件不支持的 OpenGL 版本的一部分。 @Xirema 我现在的硬件支持 OpenGL 4.5,旧的只支持 OpenGL 4.3,但是代码可以在旧的硬件上运行。这可以接受吗? glBindBuffer(GL_SHADER_STORAGE_BUFFER, 1); 你认为这是在做什么?您正在绑定一个数字,而不是实际的缓冲区对象。 @NicolBolas 这只是为了简化,如您所知, genBuffer() 调用返回一个无符号整数作为缓冲区的“名称”...... 【参考方案1】:

我能做到。

如前所述,我将项目从台式机移至笔记本电脑。我的笔记本电脑比台式机具有更新的 OpenGL 支持,但我的笔记本电脑使用的是 CPU 显卡(英特尔高清显卡)而不是专用 GPU GeForce 740M。

这样,我的 OpenGL 程序在不支持某些较新 OpenGL 功能(如 GL_SHADER_STORAGE_BUFFER 目标)的设备上执行,这就是它崩溃的原因。

【讨论】:

您需要在使用扩展程序之前检查它们。如果 GPU 不支持某些东西,让您的应用程序出现段错误而不是优雅地失败会使用户感到困惑。 @ColonelThirtyTwo 我确信我的代码工作正常,因为我之前用另一个(旧的)GPU 测试过它,而新的 GPU 在扩展和东西方面的​​能力要强得多。我的问题是我的 SO 试图在 Intel HD Graphics vga 中执行 OpenGL 程序,而不是专用 GPU。感谢您的帮助,谢谢!

以上是关于OpenGL glBufferStorage 崩溃的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL:随机调用 OpenGL 函数时崩溃

调整 OpenGL 窗口的大小会导致它崩溃

调用OpenGL函数时程序崩溃

使用glew时opengl崩溃

调用glGenBuffers时openGL崩溃

OpenGL 应用程序崩溃