首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

glReadPixels不读取iOS上的深度缓冲区值

关于glReadPixels不读取iOS上的深度缓冲区值,这个问题可能是由于在iOS上,OpenGL ES的实现与桌面版本的OpenGL有所不同。在iOS上,glReadPixels默认只能读取颜色缓冲区的数据,而不能读取深度缓冲区的数据。

如果需要读取深度缓冲区的数据,可以使用扩展的拓展功能EXT_packed_depth_stencil和EXT_texture_storage来创建深度缓冲区和纹理对象,并将其绑定到帧缓冲区对象上。然后,可以使用glReadPixels函数读取深度缓冲区的数据。

以下是一个示例代码,展示了如何使用扩展功能创建深度缓冲区和纹理对象,并将其绑定到帧缓冲区对象上:

代码语言:c
复制
// 创建深度缓冲区和纹理对象
glGenRenderbuffers(1, &depthRenderbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, depthRenderbuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, width, height);
glGenTextures(1, &depthTexture);
glBindTexture(GL_TEXTURE_2D, depthTexture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, width, height, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, NULL);

// 将深度缓冲区和纹理对象绑定到帧缓冲区对象上
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthRenderbuffer);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depthTexture, 0);

然后,可以使用glReadPixels函数读取深度缓冲区的数据:

代码语言:c
复制
GLfloat depthPixels[width * height];
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
glReadPixels(0, 0, width, height, GL_DEPTH_COMPONENT, GL_FLOAT, depthPixels);

这样就可以成功读取iOS上的深度缓冲区值了。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

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

值得注意glReadPixels 读取是当前绑定 FBO 颜色缓冲区图像,所以当使用多个 FBO(帧缓冲区对象)时,需要确定好我们要读那个 FBO 颜色缓冲区。...glReadPixels 性能瓶颈一般出现在大分辨率图像读取,所以目前通用优化方法是在 shader 中将处理完成 RGBA 转成 YUV (一般是 YUYV 格式),然后基于 RGBA 格式读出...PBO 仅用于执行像素传输,不连接到纹理,且与 FBO (帧缓冲区对象)无关。 PBO 类似于 VBO(顶点缓冲区对象),PBO 开辟也是 GPU 缓存,而存储是图像数据。...2 个 PBO read pixels 如上图所示,利用 2 个 PBO 从帧缓冲区读回图像数据,使用 glReadPixels 通知 GPU 将图像数据从帧缓冲区读回到 PBO1 中,同时 CPU...两者在使用步骤基本一致,均可以用于快速读取显存(纹理)图像数据,但是 HardwareBuffer 还可以访问其他硬件存储器,使用更广泛。

4.2K10

深度学习应用:iOS 图像风格迁移

fast-style-transfer-coreml 图像风格迁移,用 python 就可以实现,如果想要在手机上面(联网)查看效果怎么办呢?...如果你是用 iOS 系统,你一定听说过 Prisma,它赢得了 2016 年度最佳应用程序,就是这样,它在短短几秒钟内,可以将你图片转换成你所选择任何风格。...Prisma.png 这里我们使用 iOS 11 推出 CoreML 实现 Prisma 类似的功能。.../android/ TF Stylize 首先需要用 Tensorflow 训练好模型,之后可以用 Apple 官方提供转换工具 coremltools 导出成 iOS 11 支持 CoreML 格式...StyleArts.PNG 移动端虽然不适合训练机器学习模型,不过可以围魏救赵,通过导出 PC 上面训练好模型也可以体验人工智能带来便利。

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

    下面是第 19 期面试题精选,我们来介绍几种在 Android 开发中读取纹理数据方法: 1、介绍一下 glReadPixels? 2、介绍一下 ImageReader?...1、介绍一下 glReadPixelsglReadPixels 是 OpenGL ES API,通常用于从帧缓冲区读取像素数据,OpenGL ES 2.0 和 3.0 均支持。...glReadPixels 读取是当前绑定 FBO 颜色缓冲区图像,所以当使用多个 FBO(帧缓冲区对象)时,需要确定好我们要读那个 FBO 颜色缓冲区。...glReadPixels 性能瓶颈一般出现在大分辨率图像读取,所以目前通用优化方法是在 shader 中将处理完成 RGBA 转成 YUV (一般是 YUYV 格式),然后基于 RGBA 格式读出...acquireNextImage 更推荐在批处理或者后台程序中使用,恰当使用本方法将会导致得到 images 出现不断增长延迟。

    41411

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

    而在音视频领域,相信不少同学都有从FBO读取像素数据需求,熟悉OpenGL ES童鞋应该首先想到了glReadPixels,而了解更为深入童鞋相信都会使用更为高效PBO。   ...来读取像素数据到一个指定缓冲区就可以了。...在使用时候,先绑定第一个PBO,然后调用另一个特殊glReadPixels异步读取像素数据,这时候会立即返回,而不是像第一种方法那样需要等待。...出现这种问题估计是硬件留下坑。   所以,在Android使用PBO是有比较多兼容性问题,包括上面说。...正确使用PBO方式是,首先判断是否支持PBO,如果支持,则还是先使用glReadPixels进行读取测试,记录平均耗时,然后再使用PBO进行读取测试,记录平均耗时,最后对比两个方式耗时,选择最快一个

    2.2K20

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

    深度缓冲区和模板缓冲区这类不需要在后续着色器阶段中被读取和处理数据,正是RBO绝佳应用场景。 由于RBO不能被直接读取,所以无法像操作纹理一样从 RBO 中直接获取(采样)数据。...但这并不意味着不可以读取RBO中缓存数据,可以借助 glReadPixels接口获得指定区域内数据,该接口详细叙述如下: //// 从帧缓冲区读取像素数据 /// x: 从帧缓冲区读取像素左下角...x 坐标 /// y: 从帧缓冲区读取像素左下角 y 坐标 /// width: 从帧缓冲区读取像素宽度 /// height: 从帧缓冲区读取像素高度 /// format: 像素数据格式...性能差异:由于 RBO 不需要执行采样和读取操作,因此在存储如深度缓冲或模板缓冲等临时渲染数据时,它能提供比纹理更好性能表现。...然后,我们将这个 RBO 附加到帧缓冲对象深度-模板附件。 4. 总结 本文在前一章节(帧缓冲)基础,介绍了渲染缓冲对象,并通过对比渲染缓冲对象附件和纹理附件,详细说明了它们区别和适用场景。

    17410

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

    涉及超大图像读取时,我们一般会选择使用 Shader 将 RGBA 转 YUV,这样再使用 glReadPixels 读取图像时可以有效降低传输数据量,提升性能。...用于保存生成 NV21 图像纹理可以简单抽象成如下结构(实际纹理中数据不是这样排列): [NV21 图像纹理] 为什么宽度是 width/4 ?...由于视口宽度设置为原来 1/4 ,可以简单认为(实际比较复杂)相对于原来图像每隔 4 个像素做一次采样,由于我们生成 Y plane 图像需要对每一个像素都进行采样,所以还需要进行 3 次偏移采样...最后我们使用 glReadPixels 读取生成 NV21 图像(注意宽和高): glReadPixels(0, 0, width / 4, height * 1.5, GL_RGBA, GL_UNSIGNED_BYTE...读取生成 NV21 图像(注意宽和高) glReadPixels(0, 0, nativeImage.width / 4, nativeImage.height * 1.5, GL_RGBA

    2.4K51

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

    RGBA 转 YUV,这样再使用 glReadPixels 读取图像时可以有效降低传输数据量,提升性能,并且兼容性好。...当然读取 OpenGL 渲染结果方式还有很多种,要视具体需求和使用场景而定,具体可以参考文章:OpenGL 渲染图像读取哪家强?...offset 需要设置为一个像素归一化之后:1.0/width, 按照原理图,为了便于理解,这里将采样过程简化为以 4 个像素为单位进行。...最后我们使用 glReadPixels 读取生成 I420 图像(注意宽和高): glReadPixels(0, 0, width / 4, height * 1.5, GL_RGBA, GL_UNSIGNED_BYTE...读取生成 I420 图像(注意宽和高) glReadPixels(0, 0, nativeImage.width / 4, nativeImage.height * 1.5, GL_RGBA

    89840

    为何我云监控告警经常和监控对应

    云监控系统,可以做到实时检测云产品关键指标,并可自定义告警阈值和发送告警规则。配置监控步骤比较简单,跟着页面提示勾勾选选即可完成。但是深究起来,发现里面埋着很多数学计算复杂逻辑。...查看系统监控,对应时间最高700-800样子,并没有通知4123次。 ---- 下面通过一个测试,详细阐述告警策略配置和监控之间隐秘关系。...那么两个策略分别表示: mongo-1minute: 使用采集粒度为1分钟监控,持续有连续6个采集点(5个间隔)大于100次,才会告警; mongo-5minute: 使用采集粒度为5分钟监控,...持续有连续2个采集点(1个间隔)大于100次,才会告警。...下面看控制台监控曲线: 默认页面,显示时间粒度为1分钟,监控在25次左右波动。 image.png 更换时间粒度为5分钟,因为指标单位为次数,会经过sum聚合,指标值为125次左右波动。

    91500

    音视频面试题集锦第 21 期

    这种方法可以在损失细节情况下提供非常高质量图像,但性能消耗很高,因为它需要渲染更多像素。 SSAA 通常用于离线渲染,而不是实时渲染,因为它对硬件资源要求非常高。...例如,当更新纹理时,可以先将数据复制到 PBO,然后由 GPU 直接从 PBO 读取,而不是每次都从 CPU 内存中复制。...双 PBO 例如上图所示,利用 2 个 PBO 从帧缓冲区读回图像数据,使用 glReadPixels 通知 GPU 将图像数据从帧缓冲区读回到 PBO1 中,同时 CPU 可以直接处理 PBO2 中图像数据...内存映射:PBO 内存映射机制允许 CPU 直接访问 GPU 缓冲区,这样可以更快速地传输数据,因为它避免了常规内存访问开销。...适用场景:对于需要频繁更新或读取大量像素数据应用程序,如图像处理、计算机视觉或大规模渲染任务,PBO 可以显著提高性能。 3、iOS 如何使用分段转码,如何设置分片大小?

    17411

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

    ,这样再使用 glReadPixels 读取图像时可以有效降低传输数据量,提升性能,并且兼容性好。...当然读取 OpenGL 渲染结果方式还有很多种,要视具体需求和使用场景而定,具体可以参考文章:OpenGL 渲染图像读取哪家强?...offset 需要设置为一个像素归一化之后:1.0/width, 按照原理图,为了便于理解,这里将采样过程简化为以 4 个像素为单位进行。...最后我们使用 glReadPixels 读取生成 I420 图像(注意宽和高): glReadPixels(0, 0, width / 4, height * 1.5, GL_RGBA, GL_UNSIGNED_BYTE...读取生成 I420 图像(注意宽和高) glReadPixels(0, 0, nativeImage.width / 4, nativeImage.height * 1.5, GL_RGBA, GL_UNSIGNED_BYTE

    1.1K20

    OpenGL 使用 PBO 零拷贝替换 glReadPixels

    之前介绍 OpenGL PBO 使用方法文章发出去之后,陆陆续续有一些同学看过代码之后提出疑问:使用 PBO 读取渲染结果还是很慢啊? 今天掰扯掰扯问题出在哪?...glReadPixels 表示从帧缓冲区读取像素数据并打包(pack)进 PBO 。...之前介绍 OpenGL PBO 使用方法文章发出去之后,陆陆续续有一些同学看过代码之后提出疑问:使用 PBO 读取渲染结果还是很慢啊?...综合他们反馈结果,发现耗时主要在函数 glMapBufferRange , 我们看下这个函数实际是干嘛。...在 OpenGL 中,glMapBufferRange 函数用于映射缓冲区对象到 CPU 可以访问内存空间,以便应用程序可以直接访问和修改缓冲区数据,实际也是这个函数间接完成了 glReadPixels

    71610

    iOS OpenGL ES常见问题整理

    可是,一旦发生了crash或渲染异常,由于其本质是一个状态机,就导致了错误会累计,发生crash现场并非问题源头,十分难定位。...故此,本文根据笔者遇到OpenGL ES问题,包括crash或渲染异常,整理出一份OpenGL ES在iOS系统中问题快速定位表单。...kEAGLDrawablePropertyRetainedBacking属性设置为false,导致没保留一帧内容,而闪烁怀疑是iOS双缓冲甚至三缓冲机制导致 iOS9系统手机画面部分黑屏 iOS...系统图片花屏 iOS 9使用CGContextDrawImage解码图片时会带上一次解码残影,即使是一个新CGContext也会,需要在draw前clearRect glTexImage2D crash...创建时没有共享shareGroup,导致纹理共享,只能先传到CPU,再传给另一个context gldReadFramebufferData crash 除了上面提到glReadPixels出问题可能外

    2.7K50

    OpenGL ES编程指南(二)

    从storyboard加载视图后,创建一个上下文并将其设置为视图上下文属性。 GLKit视图会自动创建和配置自己OpenGL ES帧缓冲区对象和渲染缓冲区。...,读取displaylinktimestamp属性以获取要渲染下一帧时间戳。...它可以使用该来计算下一帧中对象位置。 通常,每次刷新屏幕时都会触发displaylink对象; 该通常为60 Hz,但在不同设备可能会有所不同。 大多数应用程序不需要每秒刷新屏幕60次。...渲染一帧 下图展示了OpenGL ES应用程序在iOS呈现并呈现帧步骤。 这些步骤包括许多提示,以提高应用程序性能。...虽然您应用程序需要颜色渲染缓冲区才能显示到屏幕,但它可能不需要深度缓冲区内容。

    1.9K20

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

    ) glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 将颜色缓冲区内容作为像素图直接使用 //参数1:x,矩形左下⻆角窗⼝坐标 //参数2:y,矩形左下⻆角窗⼝...指向数据类型,告诉OpenGL 使⽤缓存区中什么 数据类型来存储颜⾊分量,像素数据数据类型,参考 表2 //参数7:pixels,指向图形数据指针 void glReadPixels(GLint...glReadBuffer(mode); // 指定写⼊入缓存 glWriteBuffer(mode); 读取图像文件 //读取TAG图像文件,OpenGL中使用,在OpenGL ES中常用是...//width、height、depth参数:指加载纹理理宽度、⾼高度、深度。一般使用2整数次⽅方。(OpenGL旧版中会有这个要求) //border:允许为纹理贴图指定⼀个边框宽度。...//参数2:pname,指定需要设置那个纹理参数 //参数3:param,设定特定纹理参数 设置过滤方式 ?

    1.2K30

    iOS开发-OpenGL ES魔方应用

    分享 这系列收集OpenGL ES应用。 iOS开发-OpenGLES画图应用 这篇介绍3D魔方(原文地址),重点是魔方旋转与点击判断。...用户看不到用于拾取渲染,因为用于拾取像素颜色渲染缓存不会显示到屏幕,而是渲染到一个OpenGL ES帧缓存对象(FBO)中。...1、基于颜色拾取 把位置信息编码进颜色分量,使用 glReadPixels() 读取。 把渲染从FBO读取到CPU控制内存需要花费时间执行耗时同步操作。...不需要读取FBO渲染,通过触摸视口坐标和平截体,可形成光线。 核心思路 魔方直接渲染到屏幕,拾取时候再渲染一次到FBO,通过拾取结果决定是旋转某一列还是旋转整个魔方。...); 思考2:为何不直接读取屏幕颜色?

    1.5K90

    音视频知识图谱 2022.04

    前些时间,我在知识星球创建了一个音视频技术社群:关键帧音视频开发圈,在这里群友们会一起做一些打卡任务。...读取是当前绑定 FBO 颜色缓冲区图像,所以当使用多个 FBO(帧缓冲区对象)时,需要确定好我们要读那个 FBO 颜色缓冲区。 在大分辨率图像读取时性能略差。...PBO 类似于 VBO(顶点缓冲区对象),开辟也是 GPU 缓存,而存储是图像数据。PBO 不连接到纹理,且与 FBO (帧缓冲区对象)无关。...两者在使用步骤基本一致,均可以用于快速读取显存(纹理)图像数据,但是 HardwareBuffer 还可以访问其他硬件存储器,使用更广泛。...性能和实现选择 大分辨率情况,ImageReader、PBO、HardwareBuffer 明显优于 glReadPixels 方式。

    69130

    OpenGL ES编程指南(四)

    (fragments), 运行片段着色器( fragment shader)以计算每个片段颜色和深度,并将片段混合到帧缓冲区中以进行显示。...传统,实现粒子系统应用程序在CPU运行其模拟,将模拟结果存储在顶点缓冲区中以用于渲染粒子艺术。 但是,将顶点缓冲区内容传输到GPU内存是非常耗时。...在下一帧中,使用上一帧模拟步骤输出顶点缓冲区作为下一个模拟步骤输入 OpenGL ES 2.0 OpenGL ES 2.0提供了可编程着色器灵活图形管道,并可在所有当前iOS设备使用。...函数glFinish刷新命令缓冲区,然后等待所有先前提交命令在图形硬件完成执行。 检索帧缓冲区内容函数(如glReadPixels)也等待提交命令完成。 命令缓冲区已满。...当您应用移动到后台时,您应该刷新命令缓冲区,因为在应用处于后台时在GPU执行OpenGL ES命令会导致iOS终止您应用。 (请参阅实施多任务处理型OpenGL ES应用程序。)

    1.9K20

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

    前文曾经介绍过 Android OpenGL 渲染图像读取方式,分别是 glReadPixels、 PBO、 ImageReader 以及 HardwareBuffer 。...glReadPixels 大家经常用来读取 RGBA 格式图像,那么我用它来读取 YUV 格式图像行不行呢?答案是肯定,这就要用到 shader 来实现 RGB 到 YUV 图像格式转换。...glReadPixels 性能瓶颈一般出现在大分辨率图像读取,在生产环境中通用优化方法是在 shader 中将处理完成 RGBA 转成 YUV (一般是 YUYV),然后基于 RGBA 格式读出...转换,然后渲染到屏幕。...YUV 格式图像 UV 分量默认分别是 127 ,Y 分量默认是 0 ,8 个 bit 位取值范围是 0 ~ 255,由于在 shader 中纹理采样需要进行归一化,所以 UV 分量采样需要分别减去

    7.3K51
    领券