问题标签 [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.

0 投票
1 回答
980 浏览

c++ - 为什么建议使用多个像素缓冲区对象。确定是多余的吗?

当有人询问 OpenGL 中的视频流纹理时,通常会参考这篇文章。

它说:

为了最大限度地提高流传输性能,您可以使用多个像素缓冲区对象。该图显示同时使用了 2 个 PBO;glTexSubImage2D() 从一个 PBO 复制像素数据,同时将纹理源写入另一个 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 的调用会产生一个新的缓冲区供我写入。

那篇文章的作者在这方面的知识似乎比我自己还要多。我完全误解了这一点吗?

0 投票
2 回答
180 浏览

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 并测试点击了哪个像素颜色。提前感谢任何可以提供帮助的人!

0 投票
1 回答
79 浏览

opengl - OpenGL - 在将纹理数据查询到 PBO 后,我可以使用纹理吗?

我通过 FBO 渲染成纹理。我想将纹理数据复制到 PBO 中,所以我使用glGetTexImage. 我将glMapBuffer在此 PBO 上使用,但仅在下一帧(或更高版本)中使用,因此它不会导致停顿。

但是,我可以在glGetTexImage通话后立即使用纹理而不会造成停顿吗?我可以将它绑定到纹理单元并从中渲染吗?我可以通过 FBO 再次渲染它吗?

0 投票
1 回答
690 浏览

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。

0 投票
0 回答
319 浏览

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

0 投票
1 回答
171 浏览

c++ - 带有 PBO 的 GPU 的视频流在 OpenGL 中加载 ImageQT

我计划使用 C++、QT 4.7.4 和 OpenGL 开发一个用于实时视频操作的工具,我在 Visual Studio 2008 上。我检查了很多网站,但我的代码不起作用,因为我尝试使用 PBO。目前我想象以下步骤顺序:

  1. 将图像文件加载到 QTimage
  2. 使用 glmapBuffer 将数据复制到 PBO
  3. 使用 glTextSubImage2D 转移到纹理中

是正确的 ?

在成功使用几张图片后,我将从视频开始。

看看我是否不想错过解释我的代码的东西: INIT 我使用 glut 所以我初始化了:

在我的主要内容中:

在函数 loadImage 中,我执行第 1 步:

第 2 步:

最后在 glutDisplayFunc() 中:

我在 glTexSubImage2D() INVALID_OPERATION 上只收到一个错误,通常表示格式问题,但我检查了许多不同的格式。

我不知道我是完全输了还是接近成功了。

0 投票
0 回答
169 浏览

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 复制的步骤是什么?

0 投票
0 回答
70 浏览

opengl - OpenGL Pin PBO 内存

是否可以固定 PBO 以读取和/或写入系统内存?理想情况下,最好避免与 glMapBuffer 和 glUnmapBuffer 同步,并使用其他方式通过 DMA 将帧发送到系统内存或从系统内存发送到 GPU。

0 投票
0 回答
108 浏览

c++ - 无法使用 PBO 和 glReadPixels 读取纹理值

我通过渲染到 FBO 创建了一个纹理,并且很长一段时间以来我一直在尝试读取纹理但没有成功。在我尝试使用 glReadPixels() 和 glGetTexImage()(访问冲突错误)失败后,我决定尝试使用 PBO。

这是我在渲染到帧缓冲区并成功创建纹理后立即使用的代码:

但是,我从不进入循环,这意味着没有读取任何值。我是不是忘记了什么?

0 投票
1 回答
35 浏览

oop - 没有从类方法返回到 PBO 的数据

我想从 abap 方法返回表的记录,这是类的字段,但没有任何内容返回到 PBO 中的变量

类中的定义

MS_ZORK_JG_SETTING 是一种数据类型,包含来自 ZORK_JG_SETTING 透明表的数据,使用其他方法正确填充,因此该变量中有正确的数据

在屏幕的 pbo 中,我想将返回值分配给与返回类型相同的变量

但是 wa_jg_setting 是空的。告诉我为什么以及如何修复它?

调用画面的位置

和 get_ms_zork_jg_settings 方法。我将字段值分配给形式参数