问题标签 [pbo]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 为什么建议使用多个像素缓冲区对象。确定是多余的吗?
当有人询问 OpenGL 中的视频流纹理时,通常会参考这篇文章。
它说:
为了最大限度地提高流传输性能,您可以使用多个像素缓冲区对象。该图显示同时使用了 2 个 PBO;glTexSubImage2D() 从一个 PBO 复制像素数据,同时将纹理源写入另一个 PBO。
对于第 n 帧,PBO 1 用于 glTexSubImage2D(),PBO 2 用于获取新的纹理源。对于第 n+1 帧,2 个像素缓冲区正在切换角色并继续更新纹理。由于异步 DMA 传输,可以同时执行更新和复制过程。CPU 将纹理源更新为 PBO,而 GPU 从另一个 PBO 复制纹理。
它们提供了一个简单的基准程序,允许您在没有 PBO、使用单个 PBO 和使用两个 PBO 的纹理更新之间循环,如上所述。
启用一个 PBO 时,我看到性能略有提升。但第二个 PBO 并没有真正的区别。
就在代码 glMapBuffer 的 PBO 之前,它调用 glBufferData 并将指针设置为 NULL。这样做是为了避免同步停止。
所以,这是我的问题……这不是让第二个 PBO 完全没用吗?只是浪费内存!?
使用两个 PBO,纹理数据存储 3 次。纹理中有 1 个,每个 PBO 中有 1 个。
使用单个 PBO。数据有两个副本。如果glMapBuffer创建一个新的缓冲区,因为现有的缓冲区目前正在被DMA到纹理中,暂时只有第三个?
评论似乎表明 OpenGL 驱动程序内部能够创建第二个缓冲区 IF 并且仅在需要避免停止管道时才创建。正在使用的缓冲区正在被 DMA 处理,我对 map 的调用会产生一个新的缓冲区供我写入。
那篇文章的作者在这方面的知识似乎比我自己还要多。我完全误解了这一点吗?
java - PBO 缓冲区内容是什么意思?
我试图通过使用 PBO(使用 OpenGL 的像素缓冲区对象)来实现颜色拾取系统,当我完成时,我意识到映射时从 PBO 出来的数字根本没有任何意义。我让我的应用程序渲染不同颜色的大方块,结果在这些不同颜色之间发生了变化,但即使在分析了数字之后,我也无法理解。
例如,点击纯红色给了我(-1,0,0)的字节,而纯蓝色给了(0,0,-1),但是违反所有逻辑,纯绿色给了(-1,0,-1) , 青色也给出 (-1,0,0),黄色给出 (76,-1,0)。
显然这些数字是错误的,因为两种不同的颜色会导致相同的字节结构。完全红色不应该是 (127,0,0) 吗?
这是我用于初始化的代码,大小为 3,因为我只读取一个像素。
这是我用于读取像素的代码
如果我所做的任何假设有误,请纠正我。我可能计划使用这个系统来判断哪个 gui 元素被点击,方法是将它们中的每一个渲染到具有唯一颜色的 fbo 并测试点击了哪个像素颜色。提前感谢任何可以提供帮助的人!
opengl - OpenGL - 在将纹理数据查询到 PBO 后,我可以使用纹理吗?
我通过 FBO 渲染成纹理。我想将纹理数据复制到 PBO 中,所以我使用glGetTexImage
. 我将glMapBuffer
在此 PBO 上使用,但仅在下一帧(或更高版本)中使用,因此它不会导致停顿。
但是,我可以在glGetTexImage
通话后立即使用纹理而不会造成停顿吗?我可以将它绑定到纹理单元并从中渲染吗?我可以通过 FBO 再次渲染它吗?
opengl - 具有 PBO 的深度值的非阻塞 glReadPixels
我正在从帧缓冲区读取单个像素的深度以实现拾取。最初我的 glReadPixels() 需要很长时间(5ms 左右),在 nVidia 上它甚至会在这段时间内消耗 100% 的 CPU 。在 Intel 上它也很慢,但是 CPU 空闲。
从那时起,我使用 PixelBufferObject 功能PBO来使 glReadPixels 异步并且还使用这个众所周知的示例进行双缓冲。
这种方法效果很好,让我异步调用 glReadPixels() ,但前提是我读取 RGBA值。如果我使用相同的 PBO 方法来读取深度值,则 glReadPixels() 会再次阻塞。
读取 RGBA:glReadPixels() 需要 12µs。
读取深度:glReadPixels() 需要 5ms。
我在 nVidia 和 Intel 驱动程序上试过这个。具有不同的格式/类型组合。我试过了:
和:
和:
这些都不会导致异步 glReadPixels() 调用。但是,如果我通过以下调用读取 RGBA 值:
然后 glReadPixels() 立即返回,因此不再阻塞。
在读取单个像素之前,我会:
我创建了双缓冲 PBO:
我使用深度大小为 24、模板大小为 8 和默认双缓冲区的 SDL2 创建我的帧缓冲区。
我在 Ubuntu LTS 上使用 OpenGL Core Profile 3.3。
opengl - nVidia GL 驱动程序状态:纹理 0 是基本级别不一致
我正在使用glDebugMessageCallback来捕获 OpenGL 驱动程序消息。
当我启用所有消息源和严重性时,我的程序会触发此消息:
纹理状态使用警告:纹理 0 是基础级别不一致。检查纹理大小。
该消息由glReadPixels调用触发,该调用尝试使用PixelBufferObject (PBO) 从 FBO 帧缓冲区读取深度值。
确切的 glReadPixels 调用如下所示:
PBO 创建为:
该消息的实际含义是什么?什么是“基本水平一致”?等级指的是什么?
正在读取的 FBO 具有 COLOR_ATTACHMENT0 和 DEPTH_ATTACHMENT 并且是完整的。
FBO 的颜色纹理(800x640 纹素)是通过以下方式创建的:
FBO 的深度纹理(800x640 纹素)是通过以下方式创建的:
glCheckFramebufferStatus(GL_FRAMEBUFFER) 返回GL_FRAMEBUFFER_COMPLETE。
glGetError() 不返回错误。
操作系统:Ubuntu LTS
显卡:英伟达 GTX750Ti
GL 版本:核心配置文件 3.3
驱动程序:NVIDIA 390.116
c++ - 带有 PBO 的 GPU 的视频流在 OpenGL 中加载 ImageQT
我计划使用 C++、QT 4.7.4 和 OpenGL 开发一个用于实时视频操作的工具,我在 Visual Studio 2008 上。我检查了很多网站,但我的代码不起作用,因为我尝试使用 PBO。目前我想象以下步骤顺序:
- 将图像文件加载到 QTimage
- 使用 glmapBuffer 将数据复制到 PBO
- 使用 glTextSubImage2D 转移到纹理中
是正确的 ?
在成功使用几张图片后,我将从视频开始。
看看我是否不想错过解释我的代码的东西: INIT 我使用 glut 所以我初始化了:
在我的主要内容中:
在函数 loadImage 中,我执行第 1 步:
第 2 步:
最后在 glutDisplayFunc() 中:
我在 glTexSubImage2D() INVALID_OPERATION 上只收到一个错误,通常表示格式问题,但我检查了许多不同的格式。
我不知道我是完全输了还是接近成功了。
opengl - GPU内部的OpenGL像素传输
我最近一直在使用 VR,遇到了一些与 OpenGL 相关的问题。我用于 VR 的 API 捕获视频流并将其写入纹理,然后我想将此纹理提交给耳机。但是 API 中存在不兼容:我从流中获取的纹理具有未定义的内部格式,无法直接提交给耳机。
我正在研究一种解决方法,目前,我使用了 GPU -> CPU -> GPU 传输:我读取第一个纹理像素(使用 glReadPixels)并将它们写入缓冲区,然后我使用此缓冲区创建纹理正确的格式。这工作正常,但由于数据传输而有一些延迟。
我一直在尝试直接进行 GPU 复制,但失败了:
我尝试使用 PBO,但遇到无效操作问题(按照http://www.songho.ca/opengl/gl_pbo.html),这里是 glReadPixels 上操作无效的代码
/li>我尝试使用 FBO,但遇到指针异常。
- glCopyImageSubData 不起作用,因为第一个纹理内部格式无法识别。
进行直接 GPU 复制的步骤是什么?
opengl - OpenGL Pin PBO 内存
是否可以固定 PBO 以读取和/或写入系统内存?理想情况下,最好避免与 glMapBuffer 和 glUnmapBuffer 同步,并使用其他方式通过 DMA 将帧发送到系统内存或从系统内存发送到 GPU。
c++ - 无法使用 PBO 和 glReadPixels 读取纹理值
我通过渲染到 FBO 创建了一个纹理,并且很长一段时间以来我一直在尝试读取纹理但没有成功。在我尝试使用 glReadPixels() 和 glGetTexImage()(访问冲突错误)失败后,我决定尝试使用 PBO。
这是我在渲染到帧缓冲区并成功创建纹理后立即使用的代码:
但是,我从不进入循环,这意味着没有读取任何值。我是不是忘记了什么?
oop - 没有从类方法返回到 PBO 的数据
我想从 abap 方法返回表的记录,这是类的字段,但没有任何内容返回到 PBO 中的变量
类中的定义
MS_ZORK_JG_SETTING 是一种数据类型,包含来自 ZORK_JG_SETTING 透明表的数据,使用其他方法正确填充,因此该变量中有正确的数据
在屏幕的 pbo 中,我想将返回值分配给与返回类型相同的变量
但是 wa_jg_setting 是空的。告诉我为什么以及如何修复它?
调用画面的位置
和 get_ms_zork_jg_settings 方法。我将字段值分配给形式参数