为啥 OpenGL 告诉我我已经使用了 GL_STATIC_DRAW 而我已经指定了其他方式?

Posted

技术标签:

【中文标题】为啥 OpenGL 告诉我我已经使用了 GL_STATIC_DRAW 而我已经指定了其他方式?【英文标题】:Why is OpenGL telling me I've used GL_STATIC_DRAW when I've specified otherwise?为什么 OpenGL 告诉我我已经使用了 GL_STATIC_DRAW 而我已经指定了其他方式? 【发布时间】:2017-10-16 13:15:31 【问题描述】:

当我使用 OpenGL 启用调试层时,我注册了一个回调,只要有任何需要告诉我的信息就会调用它。似乎并非所有传递给回调的消息都是错误的。有一个“其他”类别,它似乎在你做某事时输出这些消息。就我而言,我创建了一个 VBO:

GLuint VBO_ID;
glGenBuffers(1, &VBO_ID); // The VBO_ID I get back is 3.
glBindBuffer(GL_ARRAY_BUFFER, VBO_ID);
glBufferData(GL_ARRAY_BUFFER, sizeInBytes, vertices, GL_DYNAMIC_COPY);
// At this point the callback is called, which gives the message:

消息:缓冲区详细信息:缓冲区对象 3(绑定到 GL_ARRAY_BUFFER_ARB,使用提示是 GL_STATIC_DRAW) 将使用 VIDEO 内存作为缓冲区对象操作的来源。

不管使用提示是什么(glBufferData 的最后一个参数),这条消息总是说使用提示是GL_STATIC_DRAW。不管我使用GL_DYNAMIC_COPYGL_DYNAMIC_DRAWGL_STATIC_READ,什么都行。消息总是一样的。

所以是的,我真的很困惑。还有为什么它会给出这个消息,这不是一个警告,因为我没有做错任何事情,这只是一个确认。我已经结束禁用此“其他”类别的消息,否则我的日志只会被这些消息填满,因为每当我做某事时都会调用它。

【问题讨论】:

如果调试层以某种方式从显卡或驱动程序实现轮询,可能是实现完全忽略了提示(我认为 AMD 正在这样做,不确定 Intel 和 Nvidia)并且只返回 GL_STATIC_DRAW 作为默认值。 @CollapsedMargin 我明白了。我的卡是 Nvidia GTX980 @Zebrafish:调试消息都是实现定义的。因此,我们真的不知道为什么您的实现会向您发送该消息(或者为什么它说 GL_ARRAY_BUFFER_ARB,而 GL_ARRAY_BUFFER 已经成为核心 OpenGL 十多年了。) GL_STATIC_DRAW 或 GL_DYNAMIC_COPY 是对驱动程序的一种提示。司机在查看您的数据访问模式时可能会决定没有必要将他的数据放在特殊区域。通过指定动态副本,您告诉驱动程序我在 cpu 上的缓冲区可能会修改很多次,所以我会更新它并重新发送很多次,但是如果您的数据没有修改,说每个绘图调用驱动程序可能只是决定将它放在舒适的位置驱动程序并覆盖您的请求。它只是由驱动程序完成的一种优化,这让您感到困惑。 【参考方案1】:
    如果您启用低严重性/信息/其他,Nvidia 驱动程序非常冗长,请随意禁用这些 正如其他人所说,GL_DYNAMIC_COPY 只是一个提示,驱动程序可以随意忽略它。 根据您对缓冲区的访问模式,您可能会看到消息指出缓冲区已在不同位置(主机内存、DMA)重新创建

不用担心那个常数,只要输入 GL_STATIC_DRAW。它是旧 GL 版本的遗留物。您还可以使用 glBufferStorage 来更精确地指定缓冲区使用情况。

【讨论】:

以上是关于为啥 OpenGL 告诉我我已经使用了 GL_STATIC_DRAW 而我已经指定了其他方式?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Flutter 编译器告诉我我的应用程序不存在?

为啥 Microsoft Graph API 告诉我我刚刚创建的事件仍然存在时被“@removed”?

为啥 Game Maker Studio 告诉我我的 if 语句不起作用?

我想在 android 应用程序中发布 geosever 层,使用 arcgis SDK,我已经完成了代码但它不起作用,请告诉我我做错了啥?

JSONField Django 模板没有告诉我我做了啥

为啥 Freecodecamp css 教程给出错误