问题标签 [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 回答
972 浏览

android - Android Opengl ES 3.0 像素缓冲区对象和 glReadPixel

我想使用 PBO(适用于 Android 4.3+)来提高 glReadPixels() 性能,因为我的测试设备中的每一帧 glReadPixels 大约需要 30~50ms(1280*960)。但我不能直接在 Java 中使用 glReadPixels,因为最后一个参数不能为零或“null”。我也尝试使用这里提到的 ndk 。但是最后一个参数必须是 (void*) 在我的 ndk 的 GLES3/gl3.h 中。所以问题是如何使用 glReadPixels 使 PBO 工作?这是获得更好性能的正确解决方案吗?

0 投票
0 回答
269 浏览

android - 将 glReadPixels 与 PBO 一起使用不会提高性能 (GLES3)

我正在尝试PBO使用(在 Android 应用程序上)实现逻辑glReadPixels,以便异步读取数据。

这样做的动机是应用程序在屏幕上呈现视频,我想截取该视频的屏幕截图,而不会延迟屏幕上的呈现。

我认为带有 PBO 的 glReadPixels 应该立即返回,但返回最多需要 250 毫秒(很像没有 pbo 的常规 glReadPixels)。

知道为什么吗?(即使没有使用实际读取数据也会发生这种情况glMapBufferRange,这实际上非常快)

这是我的代码:

0 投票
0 回答
119 浏览

c++ - OpenGL PBO更新纹理错误宽度高度数据

我有一个简单的程序试图使用 PBO 来更新动态生成的子纹理数据。问题是在纹理中获得正确的数据顺序,因为它被反转或没有以正确的顺序存储。

这是一些用于初始化、数据输入和绘制函数的代码

初始化:

现在绘制函数。我想制作垂直线,但它们被渲染为水平线,为什么?

那么为什么我的垂直线变成水平线我可以做些什么来改变它,以便将数据正确上传到显卡。我正在使用 AMD Radeon。

0 投票
1 回答
4977 浏览

opengl - 使用像素缓冲区对象将纹理从 GPU 复制到 CPU

我是 OpenGL 的新手,目前正在将 2D 纹理的内容复制回 CPU 内存,如下所示:

我注意到这非常缓慢,我开始阅读有关 PBO 的内容,并想看看这是否能让事情变得更顺利。因此,我按如下方式创建 PBO:

我认为上述行只需执行一次即可初始化 PBO。

我现在的问题是如何将数据从纹理映射到这个 PBO 对象?我知道在那之后我需要打电话glMapBuffer,但我不确定如何将此纹理附加到我的 PBO。

0 投票
1 回答
420 浏览

android - glreadpixels 使用 pbo 不能工作 - 我想使用 pbo 来保存图像,而不是使用 cpu

我想使用 pbo 来保存图像,而不是使用 cpu。所以我没有在 glreadpixels 中使用 bytebuff,而是使用 GLES30.glReadPixels(0, 0, getWidth(), getHeight(), GLES30.GL_RGBA, GLES30.GL_UNSIGNED_BYTE, null);

但它不能工作...

这是我设置的 fbo 和 pbo 代码:

画图后,我的pbo readpixels 不能工作,fbo 读错,得到原来的fbo[0] 或fbo[1],不是最终的图像。

关于 glreadpixels 的错误:

谢谢!

0 投票
1 回答
1002 浏览

android - Android 上的 PBO 不会提高 glReadPixels 的性能

我想在 OpenGL 中截取当前帧的屏幕截图以进行进一步处理,并且我正在尝试通过使用 PBO 异步读取帧缓冲区来提高 glReadPixels 的性能。

我的印象是 GL_PIXEL_PACK_BUFFER 绑定到缓冲区后的 glReadPixels 应该立即返回,但它实际上比不使用 PBO 需要相似甚至更多的时间。

以下是我的代码示例:

根据这篇文章,速度变慢的原因可能是由于内部格式(可能是 GL_BGRA)和像素传输格式(我的代码中的 GL_RGBA)之间的转换。将传输格式更改为 GL_RGB 会将 glReadPixels 的延迟减少到 100 毫秒左右,但是当我使用 GLES30.glMapBufferRange 映射缓冲区时,输出帧看起来并没有正确渲染。我还在 GLES11Ext 中尝试了 GL_BGRA 格式,但它会导致 glReadPixel 中的 GL_INVALID_OPERATION。

有没有其他方法可以让 Android 上的 glReadPixels 立即返回,以便 PBO 可以提高性能?

0 投票
0 回答
1631 浏览

android - 来自 PBO 阻塞/性能的 Android glReadPixels

我在处理 openGL 项目时遇到了一个不寻常的问题。本质上,我需要灰度单通道格式的帧数据来处理一些简历。我正在使用自定义着色器、FBO 和 PBO 来完成任务。

程序流程如下。

  1. 绑定生成的FBO
  2. draw() 到 FBO
  3. 绑定 PBO 和 glReadPixels()
  4. 从前一帧和 glMapBufferRange() 绑定 PBO
  5. 处理从 glMapBufferRange() 提供的像素数据

我想确认该过程运行正常。我想知道的是是否可以做任何事情来提高性能。我将发布一些我正在使用的代码,以便我们都可以遵循。

PBO 生成器代码

列表中的第 3 步 -> 绑定 PBO 和 glReadPixels()

列表中的第 4 步 -> 从前一帧和 glMapBufferRange() 绑定 PBO。这是从上一帧执行 glReadPixels 的 PBO。

这就是性能问题的来源。目前我正在读回 480 x 360 单通道灰度的像素(从着色器计算)。我已经运行了一些基准测试,结果如下。

据我了解,来自 PBO 的 glReadPixels 并不意味着是一个阻塞调用,但无论出于何种原因,它都会在这里阻塞它(并且性能比仅仅从 FBO 读取要差得多)。似乎 glMapBufferRange 的行为符合预期,并正确返回了所需的数据。

我唯一能想到的是我正在使用 GL_RED 并且只读回一个通道,但这仍然不能解释为什么 glReadPixels 会阻塞。

我用于基准测试的设备(一致的行为)。

  1. HTC One M8s (40-50ms)
  2. Nexus 5x (20-30ms)
  3. 谷歌像素(15-30 毫秒)

在这件事上的任何帮助将不胜感激!与此同时,我将尝试做更多的实验,看看是否有什么明显的我错过了。

编辑-> 2017 年 3 月 16 日(为清楚起见添加了更多代码)

FBO 设置代码

完整的渲染代码。为了清楚起见,我已经尽可能多地解构了逻辑和流程。

0 投票
1 回答
1786 浏览

macos - 通过 PBO 将纹理上传到 GPU 不起作用(OpenGL 版本 4.1)

我已经阅读了著名的教程OpenGL Pixel Buffer Object (PBO)。我在我的计算机上测试了示例代码,它可以工作(尽管启用了 PBO,它的性能并没有提高,但至少它可以正确渲染)。

问题在于示例代码中的 OpenGL 上下文版本相当旧(Version: 2.1 INTEL-10.22.29),而我的项目的 OpenGL 上下文版本version: 4.1 INTEL-10.22.29不再支持扩展GL_ARB_pixel_buffer_object

我已使用 PBO (OpenGL 3.3) 阅读此地图和填充纹理,因此我将代码更改为:

和渲染循环:

我的代码只是渲染一个单一的颜色纹理,如果我评论这个块======== start process PBO ================== end process PBO ==========那么一切都很顺利,但是有了这个块,它就失败了,我得到的只是一个黑屏。我已经检查了glMapBuffer工作是否正常,并且我成功地将纹理数据写入了所指向的内存ptr(通过打印出它的值来检查),但是我不知道为什么我没有得到预期的结果。

提前致谢。

我的环境:

0 投票
1 回答
194 浏览

opengl - OpenGL:有没有办法用 DSA 进行 PBO 传输?

最近,我研究了改进流媒体和诸如此类的纹理提交,尽管我进行了长时间的搜索,但我没有找到任何材料展示甚至提到任何使用仅具有 DSA 功能的 PBO 的方式。

我是不是在寻找正确的地方,还是真的没有办法?

0 投票
1 回答
338 浏览

android - android原生Opengl ES 3.0 PBO渲染空屏

我正在用 android 开发相机预览应用程序。
我的应用流程如下所示。

1) JAVA:获取相机预览缓冲区并将其传递给 JNI
2) CPP:使用 OpenGL ES 3.0 从相机预览缓冲区制作纹理
3) CPP:使用 OpenGL ES 3.0 渲染纹理

所以,我的应用程序在正常的纹理更新/渲染解决方法下运行良好。没关系。

问题是性能。我必须将每一帧更新到 GPU 内存,glTexSubImage2D(...)而且速度有点慢。
所以我正在尝试使用 PBO,但渲染的屏幕总是空白。

我不知道我错过了什么,有人可以帮忙吗?

这是我的代码:


如果我不使用 PBO,一切正常(fps 除外),所以我认为检查内部代码usePBOdoublePBO标志就足够了。