首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏字节流动

    OpenGL 使用 PBO 零拷贝替换 glReadPixels

    时,glTexImage2D 和 glTexSubImage2D 表示从 PBO 中解包(unpack)像素数据并复制到帧缓冲区 ; 将 PBO 绑定为 GL_PIXEL_PACK_BUFFER 时,glReadPixels 在 OpenGL 中,glMapBufferRange 函数用于映射缓冲区对象到 CPU 可以访问的内存空间,以便应用程序可以直接访问和修改缓冲区的数据,实际上也是这个函数间接完成了 glReadPixels

    1.8K10编辑于 2024-04-24
  • 来自专栏阿利民

    PBO是OpenGL最高效的像素拷贝方式吗?

    而在音视频领域,相信不少同学都有从FBO读取像素数据的需求,熟悉OpenGL ES的童鞋应该首先想到了glReadPixels,而了解更为深入的童鞋相信都会使用更为高效的PBO。    一、glReadPixels   glReadPixels是OpenGL ES 2.0和OpenGL ES 3.0都支持的api,使用最为简单广泛,只需要绑定一个FBO,然后就可以通过glReadPixels 由于现在Android的生态还有大部分只支持到OpenGL ES 2.0的硬件存在,所以通常需要跟glReadPixels配合使用。 判断硬件api版本,如果是3.0就使用PBO,否则使用glReadPixels。虽然使用起来比第一种方法要复杂很多,但是却能大幅提高性能,所以还是值得的。    在使用的时候,先绑定第一个PBO,然后调用另一个特殊的glReadPixels异步读取像素数据,这时候会立即返回,而不是像第一种方法那样需要等待。

    2.7K20编辑于 2022-05-16
  • 来自专栏字节流动

    Android OpenGL 渲染图像读取哪家强?

    glReadPixels glReadPixels 是 OpenGL ES 的 API ,OpenGL ES 2.0 和 3.0 均支持。使用非常方便,下面一行代码即可搞定,但是效率很低。 glReadPixels(0, 0, outImage.width, outImage.height, GL_RGBA, GL_UNSIGNED_BYTE, buffer); 当调用 glReadPixels 值得注意的是 glReadPixels 读取的是当前绑定 FBO 的颜色缓冲区图像,所以当使用多个 FBO(帧缓冲区对象)时,需要确定好我们要读那个 FBO 的颜色缓冲区。 glReadPixels 性能瓶颈一般出现在大分辨率图像的读取,所以目前通用的优化方法是在 shader 中将处理完成的 RGBA 转成 YUV (一般是 YUYV 格式),然后基于 RGBA 的格式读出 四种方式中,glReadPixels 使用最方便,HardwareBuffer 实现最复杂,实现复杂度:HardwareBuffer > PBO > ImageReader > glReadPixels

    5.4K10发布于 2020-11-03
  • 来自专栏关键帧Keyframe

    音视频面试题集锦第 19 期 | 读取纹理数据

    下面是第 19 期面试题精选,我们来介绍几种在 Android 开发中读取纹理数据的方法: 1、介绍一下 glReadPixels? 2、介绍一下 ImageReader? 1、介绍一下 glReadPixelsglReadPixels 是 OpenGL ES 的 API,通常用于从帧缓冲区中读取像素数据,OpenGL ES 2.0 和 3.0 均支持。 当调用 glReadPixels 时,首先会影响 CPU 时钟周期,同时 GPU 会等待当前帧绘制完成,读取像素完成之后,才开始下一帧的计算,造成渲染管线停滞。 glReadPixels 读取的是当前绑定 FBO 的颜色缓冲区图像,所以当使用多个 FBO(帧缓冲区对象)时,需要确定好我们要读那个 FBO 的颜色缓冲区。 下面我们介绍两种使用 glReadPixels 来进行 RGBA 转换 NV21 的示例: 1)直接获取 RGBA 数据 这种方式 GPU 传输数据到 CPU 耗时比较长。

    95111编辑于 2024-03-25
  • 来自专栏字节流动

    NDK OpenGL ES 3.0 开发(二十二):PBO

    时,glTexImage2D 和 glTexSubImage2D 表示从 PBO 中解包(unpack)像素数据并复制到帧缓冲区 ;将 PBO 绑定为 GL_PIXEL_PACK_BUFFER 时,glReadPixels 加载图像数据的耗时 不使用 PBO 加载图像数据的耗时 使用两个 PBO 从帧缓冲区读回图像数据 使用两个 PBO 从帧缓冲区读回图像数据 如上图所示,利用 2 个 PBO 从帧缓冲区读回图像数据,使用 glReadPixels m_FrameIndex % 2; int nextIndex = (index + 1) % 2; //将图像数据从帧缓冲区读回到 PBO 中 BEGIN_TIME("DownloadPixels glReadPixels with PBO") glBindBuffer(GL_PIXEL_PACK_BUFFER, m_DownloadPboIds[index]); glReadPixels(0, 0, m_RenderImage.width , m_RenderImage.height, GL_RGBA, GL_UNSIGNED_BYTE, nullptr); END_TIME("DownloadPixels glReadPixels with

    3.2K51发布于 2020-06-01
  • 来自专栏蜉蝣禅修之道

    iOS OpenGL ES常见问题整理

    问题现象 根本原因及解决方法 界面图片出现花屏 对于jpg图片解码后,以RGBA格式传入GPU纹理,需要添加alpha通道 glReadPixels crash,堆栈栈顶包含gldReadFramebufferData 特征 glReadPixels宽高参数大于实际宽高 使用OES_texture_half_float扩展时,发生渲染异常 OES_texture_half_float使用时,需要在texImage2D改变 交互时发生部分纹理黑屏 两个context创建时没有共享shareGroup,导致纹理不共享,只能先传到CPU,再传给另一个context gldReadFramebufferData crash 除了上面提到glReadPixels

    3K50发布于 2020-06-14
  • 来自专栏字节流动

    使用 OpenGL 实现 RGB 到 YUV 的图像格式转换

    前文曾经介绍过 Android OpenGL 渲染图像的读取方式,分别是 glReadPixels、 PBO、 ImageReader 以及 HardwareBuffer 。 glReadPixels 大家经常用来读取 RGBA 格式的图像,那么我用它来读取 YUV 格式的图像行不行呢?答案是肯定的,这就要用到 shader 来实现 RGB 到 YUV 的图像格式转换。 glReadPixels 性能瓶颈一般出现在大分辨率图像的读取,在生产环境中通用的优化方法是在 shader 中将处理完成的 RGBA 转成 YUV (一般是 YUYV),然后基于 RGBA 的格式读出 前面小节已经提到,先说下一个简单的思路:先将 RGBA 按照公式转换为 YUV 如(YUYV),然后将 YUYV 按照 RGBA 进行排布,最后使用 glReadPixels 读取 YUYV 数据,由于 转换成 YUYV 时数据量减半,那么 glViewPort 时 width 变为原来的一半,同样 glReadPixels 时 width 也变为原来的一半。

    8.6K51发布于 2021-05-27
  • 来自专栏字节流动

    面试官:请使用 OpenGL ES 将 RGB 图像转换为 YUV 格式。我 ……

    前文曾经介绍过 Android OpenGL 渲染图像的读取方式,分别是: glReadPixels、 PBO、 ImageReader 以及 HardwareBuffer 。 glReadPixels 大家经常用来读取 RGBA 格式的图像,那么我用它来读取 YUV 格式的图像行不行呢? 答案是肯定的,这就要用到 shader 来实现 RGB 到 YUV 的图像格式转换。 glReadPixels 性能瓶颈一般出现在大分辨率图像的读取,在生产环境中通用的优化方法是在 shader 中将处理完成的 RGBA 转成 YUV (一般是 YUYV),然后基于 RGBA 的格式读出 前面小节已经提到,先说下一个简单的思路: 先将 RGBA 按照公式转换为 YUV 如(YUYV),然后将 YUYV 按照 RGBA 进行排布,最后使用 glReadPixels 读取 YUYV 数据,由于 转换成 YUYV 时数据量减半,那么 glViewPort 时 width 变为原来的一半,同样 glReadPixels 时 width 也变为原来的一半。

    6.1K41发布于 2021-06-09
  • OpenGL中Framebuffer的学习

    附件类型对比:特性纹理附件(Texture)渲染缓冲(Renderbuffer)存储用途颜色/深度/模板均可主要深度/模板CPU访问✅glReadPixels+着色器✅glReadPixels着色器访问 GLenumetarget,GLuintframebuffer)target:指定使用帧缓冲的目标类型GL_FRAMEBUFFER:同时绑定到读写帧缓冲(最常用)GL_READ_FRAMEBUFFER:仅绑定到读取操作(如glReadPixels

    22710编辑于 2025-11-08
  • 来自专栏字节流动

    OpenGL: 如何利用 Shader 实现 RGBA 到 NV21 图像格式转换?(全网首次开源)

    10bit YUV(P010)的存储结构和处理 Shader 实现 RGBA 转 NV21 好处 OpenGL 完成图像的渲染后,很多情况下需要将渲染后的图像读取到内存进行下一步处理,这个时候使用 glReadPixels 在不涉及超大图像读取时,我们一般会选择使用 Shader 将 RGBA 转 YUV,这样再使用 glReadPixels 读取图像时可以有效降低传输数据量,提升性能。 最后我们使用 glReadPixels 读取生成的 NV21 图像(注意宽和高): glReadPixels(0, 0, width / 4, height * 1.5, GL_RGBA, GL_UNSIGNED_BYTE pBuffer; nativeImage.ppPlane[1] = pBuffer + m_RenderImage.width * m_RenderImage.height; //使用 glReadPixels 读取生成的 NV21 图像(注意宽和高) glReadPixels(0, 0, nativeImage.width / 4, nativeImage.height * 1.5, GL_RGBA

    3.3K51发布于 2021-11-01
  • 来自专栏字节流动

    OpenGL 使用 Shader 实现 RGBA 转 I420(附项目源码)

    YUV 图像格式详解 Shader 实现 RGBA 转 I420 I420 格式的图像在视频解码中比较常见,像前面文章中提到的,在工程中一般会选择使用 Shader 将 RGBA 转 YUV,这样再使用 glReadPixels 最后我们使用 glReadPixels 读取生成的 I420 图像(注意宽和高): glReadPixels(0, 0, width / 4, height * 1.5, GL_RGBA, GL_UNSIGNED_BYTE nativeImage.ppPlane[2] = nativeImage.ppPlane[1] + m_RenderImage.width * m_RenderImage.height / 4; //使用 glReadPixels 读取生成的 I420 图像(注意宽和高) glReadPixels(0, 0, nativeImage.width / 4, nativeImage.height * 1.5, GL_RGBA

    1.2K40发布于 2021-11-26
  • 来自专栏字节流动

    OpenGL 使用 Shader 实现 RGBA 转 I420(附项目源码)

    图像的基本处理 Shader 实现 RGBA 转 I420 I420 格式的图像在视频解码中比较常见,像前面文章中提到的,在工程中一般会选择使用 Shader 将 RGBA 转 YUV,这样再使用 glReadPixels 最后我们使用 glReadPixels 读取生成的 I420 图像(注意宽和高): glReadPixels(0, 0, width / 4, height * 1.5, GL_RGBA, GL_UNSIGNED_BYTE nativeImage.ppPlane[2] = nativeImage.ppPlane[1] + m_RenderImage.width * m_RenderImage.height / 4; //使用 glReadPixels 读取生成的 I420 图像(注意宽和高) glReadPixels(0, 0, nativeImage.width / 4, nativeImage.height * 1.5, GL_RGBA, GL_UNSIGNED_BYTE

    1.6K20发布于 2021-11-22
  • 来自专栏Molier的小站

    iOS 中使用 OpenGL 实现增高功能

    缩小时候如果编辑区域已经成为一条线了就不能在缩小了 if (vertices[11] > vertices[7]) { [self.glView display]; } } 通过 glReadPixels data = (GLubyte*)malloc(dataLength * sizeof(GLubyte)); glPixelStorei(GL_PACK_ALIGNMENT, 4); glReadPixels

    79740编辑于 2022-11-03
  • 来自专栏落影的专栏

    iOS开发-OpenGL ES魔方应用

    1、基于颜色拾取 把位置信息编码进颜色分量,使用 glReadPixels() 读取。 把渲染值从FBO读取到CPU控制的内存需要花费时间执行耗时的同步操作。 glEnableVertexAttribArray(ATTRIBUTE_TEXTURE_COORD); // 如果不上选择模式,使用纹理坐标 } glReadPixels

    1.8K90发布于 2018-04-27
  • 来自专栏小黑娃Henry

    OpenGL(八)--纹理相关APIOpenGL(八)--纹理相关API

    :type,解释参数pixels指向的数据类型,告诉OpenGL 使⽤缓存区中的什么 数据类型来存储颜⾊分量,像素数据的数据类型,参考 表2 //参数7:pixels,指向图形数据的指针 void glReadPixels //format、type、data参数:与上方glReadPixels函数对于的参数相同 void glTexImage2D(GLenum target, GLint level, GLint internalformat

    1.6K30发布于 2021-08-09
  • 来自专栏程序员的园——原创文章

    渲染缓冲对象——高效帧缓冲附件

    但这并不意味着不可以读取RBO中缓存数据,可以借助 glReadPixels接口获得指定区域内的数据,该接口的详细叙述如下: //// 从帧缓冲区中读取像素数据 /// x: 从帧缓冲区读取的像素的左下角 GL_UNSIGNED_BYTE, GL_BYTE, /// GL_UNSIGNED_SHORT, GL_SHORT, GL_UNSIGNED_INT, /// GL_INT, void glReadPixels

    90710编辑于 2024-09-10
  • 来自专栏一棹烟波

    OpenGL进行简单的通用计算实例

    nHeight, GL_RGBA, GL_FLOAT, pfInput); //从输出纹理缓存中读出数据 glReadBuffer(GL_COLOR_ATTACHMENT0_EXT); glReadPixels 0, GL_RGB, nWidth, nHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, puInput); 60 61 //从输出纹理缓存中读出数据 62 glReadPixels

    2.4K70发布于 2018-01-12
  • 来自专栏进击的多媒体开发

    用 OpenGL 对视频帧内容进行替换

    在非主线程中,初始化 EGL 环境,然后准备好绘制的必要工作,接着执行绘制,最后把绘制的结果通过 glReadPixels 读取出来。 drawSelf(mReplaceTextureId) 12 } 13 } 在最后读取像素内容时要注意,glReadPixels 读取的内容是上下颠倒的,需要将它翻转过来。

    2.3K20发布于 2019-07-25
  • 来自专栏字节流动

    FFmpeg 视频录制 - 视频添加滤镜和编码

    nativeImage.pLineSize[0] = nativeImage.width * 4; nativeImage.ppPlane[0] = pBuffer; glReadPixels m_RenderFrameCallback(m_CallbackContext, &nativeImage); delete []pBuffer; } } 读取渲染结果的时候除了 glReadPixels

    3K10发布于 2021-03-16
  • 来自专栏关键帧Keyframe

    音视频知识图谱 2022.04

    6)图谱路径:采集/视频采集/纹理/数据与纹理转换/纹理转数据(GPU → CPU)/Android 方案 glReadPixels OpenGL ES 2.0 和 3.0 均支持,兼容性较好。 性能和实现选择 大分辨率情况,ImageReader、PBO、HardwareBuffer 明显优于 glReadPixels 方式。

    1K30编辑于 2022-06-13
领券