【问题标题】:What does glGenBuffers indicate by returning zero?glGenBuffers 返回零表示什么?
【发布时间】:2019-03-01 06:04:14
【问题描述】:

一旦顶点数据通过网络加载,我的程序会在启动后创建许多顶点缓冲区,然后在热循环期间偶尔删除或创建顶点缓冲区。它几乎总是按预期工作,但有时在某些机器上,在热循环中创建缓冲区会产生零名称。

它看起来不像是无效状态,因为它会更早触发。此外,文档和规范对此类错误还不够清楚。这是否意味着实现用完了缓冲区名称?

我还找到了this thread。 Topicstarter 说在将名称传递给 glGenBuffers 之前对其进行初始化解决了他的问题。是否需要初始化这些值?

【问题讨论】:

  • glGetError() 中弹出的任何信息或发生该行为时的调试上下文回调?
  • 我可以想到由于许多不同大小的缓冲区的创建/删除而导致的 VRAM 内存碎片。在这样的场景中,glGenbuffers 可能会失败。重用缓冲区怎么样?

标签: opengl language-lawyer


【解决方案1】:

由于它似乎可以在某些机器上运行,glGenBuffer 返回 0 可能是因为上下文设置不正确。 Here davek20 与 glGenBuffers 有同样的问题。他通过修复不正确的上下文设置解决了这个问题。

正如 GLFW“入门”页面上的 here 所述,在“创建窗口和上下文”下,他们声明

“如果机器不支持所需的最低版本,则上下文(和窗口)创建失败。”

您的这些机器可能有正确的驱动程序,但可能不支持所有或部分版本的 OpenGL,如文档所述。

如果您使用的是GLFW_CONTEXT_VERSION_MAJORGLFW_CONTEXT_VERSION_MINOR,请考虑更改这些。我还建议检查上下文创建以返回 NULL (0)。

来自 GLFW 文档页面的示例:

GLFWwindow* window;

if (!glfwInit())
    return -1;

glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

window = glfwCreateWindow(960, 540, "OpenGL", NULL, NULL);
if (!window)
{
    glfwTerminate();
    return -1;
}

【讨论】:

  • 上下文没问题。当一些 VBO 已经创建并成功用于渲染时,就会出现问题。
  • @Sergey 我不确定,但以前的缓冲区绑定可能存在问题。之前绑定的名称无效,或者在之前的绑定调用期间设置了不正确的目标,从而导致未来的错误。我不认为 glGenBuffers 为生成 0 设置任何错误标志,但 gllsBuffer 应该返回 GL_FALSE。
猜你喜欢
  • 2014-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多