【发布时间】:2017-06-07 17:35:35
【问题描述】:
这是一个高级 OpenGL 问题,待定。它似乎更像是一个驱动程序错误。我知道标准明确规定,删除对象只会删除它的名称,因此生成器函数可以返回相同的名称。但是目前尚不清楚如何处理...
情况如下:我有一个所谓的“瞬态”(C++) 对象(从现在开始为 TO),它生成 GL 对象,使用它们将命令排入队列,然后删除它们。
现在考虑我在调用 SwapBuffers() 之前使用了不止一种这种类型。会发生以下情况:
- TO 1. 生成一个名为 VBO1 的顶点缓冲区,以及一个 VAO1 和其他东西
- TO 1. 使用 VBO1 调用一些映射/绘图命令
- TO 1. 删除 VAO1 和 VBO1(因此名称 VBO1 被释放)
- TO 2. 生成一个顶点缓冲区对象,现在当然与名称 1 同名 (VBO1) 被删除并可用,以及另一个 VAO(可能是 1)
- TO 2. 使用这个新的 VBO1(不同的顶点位置等)调用其他一些映射/绘图命令
- TO 2. 删除新的 VBO1
- SwapBuffers()
结果是:只有 TO 1. 执行的修改生效。简而言之:我想渲染一个三角形,然后是一个正方形,但我只得到了三角形。
解决方法:不删除 VBO,所以我在 TO 2 中获得了一个新名称。(VBO2)
我想在这件事上寻求您的帮助;虽然我知道我不应该在帧中删除/生成对象,但除此之外,这种“错误”机制真的让我感到不安(我的意思是那我怎么能信任 GL?...简短的回答:我不能...)
(旁注:我从事 3D 图形编程已有 12 年了,但这件事真的让我毛骨悚然……)
【问题讨论】:
-
能否添加相关代码以便我们重现此内容?
-
不幸的是,不,因为它是与工作相关的代码......我唯一可以尝试的是用我现有的一些代码重现它,但这需要时间......我会看到我的可以做。在此期间,请不要等我......
-
您确定在删除任何内容之前取消映射吗?在交换缓冲区之前调用
glFlush()有帮助吗?没有看到代码,这些都是在黑暗中拍摄的。 -
"我有一个所谓的“瞬态”(C++) 对象(从现在开始为 TO),它生成 GL 对象,使用它们将命令排入队列,然后删除它们。"这是一个想法:停止这样做。 “瞬态”存储应该通过持久地创建一个缓冲区并从中分配部分来完成。不是通过不断创建和销毁缓冲区对象。如果你每帧都调用
glGenBuffers,那你就错了。 -
@Ripi2:那么他根本无法渲染场景,并且按照他的方式,对
glBufferData的调用将失败。无论哪种方式,它都失败了。但是这种方式消除了对 API 的不当使用。 “或者数据缓冲区在每一帧中都会改变它们的大小?”这就是为什么你从主缓冲区对象中“sub-allocate”。
标签: opengl vertex-buffer