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

c++ - 在单独的线程上分配 PBO?

我有一个使用 PBO 在 cpu 和 gpu 之间传输数据的多线程 OpenGL 应用程序。

我已经合并了 PBO 的分配,但是,当池为空时,我的非 opengl 线程必须阻塞一段时间,直到 OpenGL 线程到达可以分配缓冲区的点(即完成渲染当前帧)。在我想避免的某些情况下,这种等待会导致一些滞后峰值。

是否可以在另一个线程上分配 PBO,然后由“主”OpenGL 线程使用?

0 投票
1 回答
2149 浏览

c++ - glUnmapBuffer 同时保持 glMapBuffer 内存有效为只读

对于使用 SSE 4.1 流式加载的只读操作,是否可以glUnmapBuffer使用GL_STREAM_DRAW像素缓冲区对象并仍然保留先前返回的指针所指向的数据?glMapBuffer

如果没有,是否有任何技术原因?还是这个“功能”只是被遗漏了?

0 投票
1 回答
2351 浏览

opengl - 如何将纹理复制到 PyOpenGL 中的 pbo 中?

在愉快地使用 PyOpenGL 一段时间后,我现在严重卡住了。我正在开发一个 Python 包,它允许我使用 GLSL 着色器和 OpenCL 程序进行图像处理,使用纹理作为将我的数据进出 GLSL 着色器和 OpenCL 程序的标准化方式。

一切正常,除了我无法成功将纹理复制到 pbo(像素缓冲区对象)中。我正在使用 pbo 将我的纹理数据输入/输出 OpenCL,这在 PyOpenCL 中运行良好且快速:我可以将我的 OpenCL 输出从它的 pbo 复制到纹理并显示它,我还可以将数据从 cpu 加载到一个公益组织。但是我绝望地试图用 GPU 上已经存在的纹理数据填充我的 pbo,这是我需要做的才能将 GLSL 着色器生成的图像加载到 OpenCL 中以进行进一步处理。

我已经阅读了两种方法:变体 1 绑定 pbo,绑定纹理并使用 glGetTexImage() 变体 2 将纹理附加到帧缓冲区对象,绑定 fbo 和 pbo 并使用 glReadPixels()

我还读到 glReadPixels() 和 glGetTexImage() 的 PyOpenGL 版本在绑定 pbo 时应该使用的“空”指针有问题,因此我使用的是 OpenGL.raw.GL 变体。

但在这两种情况下,我都会收到“无效操作”错误,我真的看不出我做错了什么。下面是我的pixelbuffer Python类的load_texture()方法的两个版本,我希望我没有把它们剥离得太远......

变体1:

变体 2:

编辑(添加一些关于我的 pbo 的错误和初始化的信息):

我得到的变体 1 的错误是:

我正在像这样初始化我的 pbo:

'self.arraytype' 是 GL_ARRAY_BUFFER, self.usage 我已经尝试了所有可能性以防万一,但 GL_STREAM_READ 似乎最适合我的使用类型。我通常使用的大小是 1024 x 1024,4 个平面,每个平面 1 个字节,因为它是无符号整数。这在从主机传输像素数据时效果很好。

我也在 Kubuntu 11.10 上,使用 NVIDIA GeForce GTX 580,GPU 上有 3Gb 内存,使用专有驱动程序,版本 295.33

我错过了什么?

0 投票
3 回答
20076 浏览

c++ - glPixelStorei(GL_UNPACK_ALIGNMENT, 1) 缺点?

总是使用 alginment 1 的缺点是什么?

它会影响现代 GPU 的性能吗?

0 投票
2 回答
393 浏览

opengl - glMapBufferARB 在 GDB 中返回“越界”地址?

当我使用 GDB 调试 OpenGL 程序时,GDB 存在误导行为。

我从 glMapBufferARB 得到一个地址,GDB 中的地址显示

而且我无法打印它的内容。

但是,我可以在我的程序中访问它的内容。

glMapBufferARB返回的地址和普通的内存地址有区别吗?为什么GDB不能访问它?

0 投票
2 回答
5770 浏览

opengl - 带 PBO 的异步 glReadPixels

我想使用两个 PBO 以替代方式读取像素。我以为PBO的方式会快很多,因为glReadPixels在使用PBO的时候会立即返回,而且很多时间可以重叠。

奇怪的是似乎没有太大的好处。考虑一些代码,如:

结果是

PBO的方式稍微快一点,但没有令人满意的即时回报。</p>

我的问题是:

  • 影响 glReadPixels 性能的因素是什么?有时,它的成本达到 10 毫秒,但这里是 1.3 毫秒。
  • 为什么立即返回的成本高达 1.2 毫秒?是太大还是正常?

==================================================== ==========================

根据与一个demo的对比,我发现了两个因素:

  • GL_BGRA优于GL_RGBA,1.3ms=>1.0ms(无PBO),1.2ms=>0.9ms(有pbo)
  • glutInitDisplayMode(GLUT_RGB|GLUT_ALPHA) 而不是 GLUT_RGBA, 0.9ms=>0.01ms。这就是我想要的性能。在我的系统中,GLUT_RGBA=GLUT_RGB=0。过剩阿尔法=8

然后还有两个问题:

  • 为什么 GL_BGRA 比 GL_RGBA 好?是只针对特定平台还是针对所有平台?
  • 为什么 GLUT_ALPHA 如此重要以至于它会极大地影响 PBO 的性能?
0 投票
1 回答
612 浏览

opengl - glMapBuffer 是否占用 GPU 时间?

glMapBuffer 的一个常见用法是

有 2 个 PBO 以替代方式工作。

但是,有时 doSomeWork(.) 可能在另一个线程中。如果应用了上面的代码,当前线程必须等待 doSomeWork() 完成。另一种解决方案是:

在这种情况下,同一个 PBO 的 map->unmap 过程跨越两个帧。

  • PBO 的未映射状态是否会停止 GPU 的渲染?
  • 对性能有什么不好的影响吗?
0 投票
1 回答
3620 浏览

c++ - OpenGL PBO 用于纹理上传,看不懂一件事

好的,我在这里阅读了有关 PBO 的所有内容:http ://www.opengl.org/wiki/Pixel_Buffer_Object 和那里http://www.songho.ca/opengl/gl_pbo.html,但我仍然有一个问题,我没有不知道在我的情况下我是否会从 PBO 中获得任何好处:

我正在做视频流,目前我有一个函数将我的数据缓冲区复制到 3 个不同的纹理,然后我在片段着色器中做一些数学运算并显示纹理。

我认为 PBO 可以增加 CPU -> GPU 的上传时间,但就是这样,假设我们这里的示例取自上面的第二个链接。

好吧,无论函数的行为是什么updatePixels,它仍在使用 CPU 周期将数据复制到映射缓冲区,不是吗?

所以假设我想以这种方式使用 PBO,即在函数中将我的帧像素更新为 PBO,然后在display函数中调用 glTexSubImage2D (应该立即返回)......我会看到任何速度-在性能方面?我不明白为什么它会更快......好吧,我们在 glTex* 调用期间不再等待,但我们在将帧上传到 PBO 的函数期间等待,不是吗?

有人可以帮我弄清楚吗?

谢谢

0 投票
1 回答
67 浏览

c++ - 使用 cuda_gl_interop 函数设置时是否可以检索像素缓冲区?

我已经阅读了该主题,并且正在实现并行化光线跟踪引擎(目前仅使用光线-球体交叉点)但是似乎我只能在 GLUT 窗口中显示我的结果或直接写入文件,而不是两者。我不知道如何实现这一目标。我目前正在设置一个 cudaGraphicsResource 并将其映射到一个 GL 像素缓冲区对象。由于对 OpenGL 相对缺乏经验,我不确定如何在 CPU 上检索像素数据。

编辑:对不起。正如我发布的那样,我发现了令人眼花缭乱的 glReadPixels 例程。会调查的。

0 投票
1 回答
203 浏览

c++ - PBO 的竞赛条件

我在 OpenGL 中读到了一些关于 PBO 的内容,我收到了一个关于竞态条件的问题。

让我们看下面的例子:我有两个 PBO,我想将它们的像素数据轮流传输到一个纹理对象。因此,当我为一个 PBO 启动异步像素传输时,我可以立即使用 CPU 执行其他操作,同时在后台传输像素数据。现在我对第二个 PBO 进行一些像素操作,完成后我想将像素从第二个 PBO 转移到纹理对象。但是,如果第一个 PBO 的转让还没有完成怎么办?就像在第一个示例中一样:http: //www.songho.ca/opengl/gl_pbo.html

glTextSubImage2D() 将立即返回,当第一个 PBO 的数据传输到 GPU 时,我可以开始处理第二个 PBO。如果在第一次传输完成之前到达 glTexSubImage()(现在应该传输第二个 PBO 的像素数据)怎么办?它会导致 CPU 停顿周期吗?