- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我需要在应用程序启动时为 PBO 分配一个相当大的缓冲区(1 GB
),并且这样做:
glBufferData(GL_PIXEL_UNPACK_BUFFER, new_size, 0, GL_STREAM_DRAW);
我需要在不久之后映射缓冲区(使用 glMapBuffer
),以便开始向其中写入数据。问题是,如果我在 glBufferData
之后立即调用 glMapBuffer
,它会阻塞,因为它必须等待分配完成。因此,我希望有一种方法来查询 glMapBuffer
现在是否可以立即返回,或者它是否仍然会阻塞,以便我的应用程序可以同时做其他事情。
有趣的是,栅栏对象似乎在调用 glBufferData
后立即发出信号,因此它们似乎没有告诉我任何有用的信息。
即使我这样做
glBufferData(GL_PIXEL_UNPACK_BUFFER, new_size, 0, GL_STREAM_DRAW);
glFinish();
glMapBuffer(GL_PIXEL_UNPACK_BUFFER, GL_WRITE_ONLY);
停止的是对 glMapBuffer
的调用,而不是 glFinish
。 glFlush
也是如此。
我如何知道未指定数据的缓冲区是否已完成分配并准备好映射?
最佳答案
我在规范中找不到 glBufferData
可能返回的时间。我想这是供应商根据缓冲区的给定参数做出的决定。
但我在 OGL 4.6 spec. 6.3 Mapping ... 找到:
If no error occurs, a pointer to the beginning of the mapped range is returned once all pending operations on that buffer have completed
因为分配所需的大小可能是一个挂起的操作,所以 CPU 将等待直到 glMapBuffer
返回。
同样在规范中,2.3.3 Flush and Finish:
Finish does not return until all effects from such commands on GL client and server state and the framebuffer are fully realized.
请注意,它讲述的是状态 和帧缓冲区,而不是任何其他缓冲区。因此,没有强制 glFinish
等待分配缓冲区。
在你的情况下我会做的是将所有第一个缓冲区的创建和初始化放在一个线程中。在此线程中,在 glMapBuffer
返回后,立即向应用程序发送一条消息(或更改一些标志),意思是“将数据解包到 GPU 的指针已准备就绪”。
数据上传可以在不同的线程中完成。不要忘记将 gl-context 设置为调用 gl-commands 的线程的当前线程。
关于c++ - 如何检查带有 NULL 的 glBufferData 是否已完成以及 glMapBuffer 是否不会阻塞?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50331985/
当创建一个 Buffer 并设置它的数据时,需要先将它绑定(bind)到一个 target,然后用一些数据填充绑定(bind)到该 target 的缓冲区: GLenum target = GL_AR
我想知道,如果我使用 glBufferData,它会在我调用它时准确地分配内存吗(也就是说,如果 size 参数大于此时的可用内存,它会崩溃)还是会它有某种特殊的即时规则,仅当我实际将数据复制到缓冲区
我所说的标志是 GL_STREAM_DRAW、GL_STATIC_DRAW 和 GL_DYNAMIC_DRAW。 The manual page is clear about when you sho
我尝试将索引加载到 GL_ELEMENT_ARRAY_BUFFER 中,但是当我尝试此操作时,它会用 0 分隔我的数据。 例如我加载了这些数据: [0 1 3 3 1 2] 使用函数glBufferD
我在 glBufferData 上有随机崩溃,它只发生在 Windows 上。 Mac OS 和 Linux 没有问题。这是我的上传功能,它将我保存在内存中的所有内容上传到 GPU。 vertex 是
我刚刚注意到,当我尝试使用大小:1085859108 和数据:NULL 调用 glBufferData 时,它会无提示地失败。 以下对 glBufferSubData 的调用失败并出现 OUT_OF_
我正在使用明确定义的顶点坐标数组创建 glBufferData,一切正常。使用未明确定义的数组时,结果完全不同,尽管我使用的是相同的坐标值。绘制调用以不同的顶点顺序渲染事物。 顶点是三角形网格。 代码
我正在尝试移植我的固定功能管线 openGL 代码以使用 GLSL,但我遇到了 glBufferData 的段错误。这一切都与固定功能的东西一起工作得很好(即我可以毫无问题地渲染加载的网格)。 这是加
This question询问是否可以依靠编译器不弄乱 struct 的值顺序和填充。 根据该问题的答案, OpenGL defines, very clearly, what the byte la
我不明白为什么这段代码会出现段错误: AxesMarker::AxesMarker(float size) : size_(size), vbo_vertices_(0), vbo_eleme
我正在使用 OpenGL实现某种批量绘图。为此,我创建了一个 vertex buffer来存储数据。 注意:这个缓冲区通常会在每一帧上更新,但永远不会减少大小(但仍然可以增加)。 我的问题是:使用 g
我正在使用 glBufferData 来保存一些渲染信息。 glBufferData(GL_ARRAY_BUFFER, vertex_size * sizeof(VertexData), vertic
在开发过程中,我注意到一个奇怪的“错误”,它只能在 Android 模拟器上重现。我正在使用具有 GPU 加速功能的 x86 版本。请查看以下代码: public class TestRenderer
我正在浏览 OGLdev教程,而且我一直坚持让顶点数组对象工作。相关代码如下: glBindBuffer(GL_ARRAY_BUFFER, buffers[POS_VB]); FloatBuffer
我有这段代码,它不起作用我不知道为什么,我认为它应该,但似乎第一个缓冲区数据被第二个缓冲区数据替换了。我想要实现的是第一个线条粗细与另一个不同, vector vert={-.4,.2,-.2,.6}
这个问题在这里已经有了答案: Can I delete a float array when I have used glBufferData? (2 个答案) When does OpenGL g
我有一个关于 OpenGL glBufferData() 方法的问题。我能否在 std::vector 、std::list 等结构中传递顶点数据,或者它必须是经典的 ( [] ) 数组? 最佳答案
在渲染器的初始化中,VBO被创建并绑定(bind)到GL_ARRAY_BUFFER或GL_ELEMENTS_ARRAY_BUFFER,第一个有三个顶点。调用glBufferData将这三个顶点的属性缓
我创建了一个顶点缓冲区对象类来管理应用程序中的大量顶点。用户调用构造函数创建一个glBuffer,调用glBufferData分配指定大小的空间。 有一个名为 resize 的类函数,允许用户通过再次
我是 OpenGL 的初学者,我正在尝试绘制一个彩色方 block ,我遵循了 OpenGL Book 上的教程。我正在使用示例绘制 here .因为这绘制了一个三角形,所以我修改了代码以绘制 4 个
我是一名优秀的程序员,十分优秀!