前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >OpenGL 使用 PBO 零拷贝替换 glReadPixels

OpenGL 使用 PBO 零拷贝替换 glReadPixels

作者头像
字节流动
发布2024-04-24 15:51:51
1290
发布2024-04-24 15:51:51
举报
文章被收录于专栏:字节流动字节流动

之前介绍 OpenGL PBO 使用方法的文章发出去之后,陆陆续续有一些同学看过代码之后提出疑问:使用 PBO 读取渲染结果还是很慢啊?

今天掰扯掰扯问题出在哪?

前倾回顾:

PBO 是什么

OpenGL PBO(Pixel Buffer Object),被称为像素缓冲区对象,主要被用于异步像素传输操作。PBO 仅用于执行像素传输,不连接到纹理,且与 FBO (帧缓冲区对象)无关。

OpenGL PBO(像素缓冲区对象) 类似于 VBO(顶点缓冲区对象),PBO 开辟的也是 GPU 缓存,而存储的是图像数据。

OpenGL PBO

与 PBO 绑定相关的 Target 标签有 2 个:GL_PIXEL_UNPACK_BUFFER 和 GL_PIXEL_PACK_BUFFER ,其中将 PBO 绑定为 GL_PIXEL_UNPACK_BUFFER 时,glTexImage2D 和 glTexSubImage2D 表示从 PBO 中解包(unpack)像素数据并复制到帧缓冲区 ;

将 PBO 绑定为 GL_PIXEL_PACK_BUFFER 时,glReadPixels 表示从帧缓冲区中读取像素数据并打包(pack)进 PBO 。

为什么要用 PBO

在 OpenGL 开发中,特别是在低端平台上处理高分辨率的图像时,图像数据在内存和显存之前拷贝往往会造成性能瓶颈,而利用 PBO 可以在一定程度上解决这个问题。

使用 PBO 可以在 GPU 的缓存间快速传递像素数据,不影响 CPU 时钟周期,除此之外,PBO 还支持异步传输。

不使用 PBO 加载纹理

上图从文件中加载纹理,图像数据首先被加载到 CPU 内存中,然后通过 glTexImage2D 函数将图像数据从 CPU 内存复制到 OpenGL 纹理对象中 (GPU 内存),两次数据传输(加载和复制)完全由 CPU 执行和控制。

使用 PBO 加载纹理

如上图所示,文件中的图像数据可以直接加载到 PBO 中,这个操作是由 CPU 控制。我们可以通过 glMapBufferRange 获取 PBO 对应 GPU 缓冲区的内存地址。

将图像数据加载到 PBO 后,再将图像数据从 PBO 传输到纹理对象中完全是由 GPU 控制,不会占用 CPU 时钟周期。所以,绑定 PBO 后,执行 glTexImage2D (将图像数据从 PBO 传输到纹理对象) 操作,CPU 无需等待,可以立即返回。

通过对比这两种(将图像数据传送到纹理对象中)方式,可以看出,利用 PBO 传输图像数据,省掉了一步 CPU 耗时操作(将图像数据从 CPU 内存复制到 纹理对象中)。

如何使用 PBO ?

之前介绍 OpenGL PBO 使用方法的文章发出去之后,陆陆续续有一些同学看过代码之后提出疑问:使用 PBO 读取渲染结果还是很慢啊?

综合他们反馈的结果,发现耗时主要在函数 glMapBufferRange , 我们看下这个函数实际上是干嘛的。

以下是 glMapBufferRange 函数的基本语法:

代码语言:javascript
复制
void* glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);

glMapBufferRange 函数返回一个指向映射缓冲区数据的指针。通过这个指针,应用程序可以直接访问和修改缓冲区的数据。

在 OpenGL 中,glMapBufferRange 函数用于映射缓冲区对象到 CPU 可以访问的内存空间,以便应用程序可以直接访问和修改缓冲区的数据,实际上也是这个函数间接完成了 glReadPixels 的功能。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2024-04-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 字节流动 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 为什么要用 PBO
  • 如何使用 PBO ?
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档