gpt4 book ai didi

iOS GLKit : set GLKBaseEffect texture with camera output

转载 作者:行者123 更新时间:2023-11-29 03:13:00 26 4
gpt4 key购买 nike

我已经设置了一个 AVCapture session ,并在委托(delegate)方法中使用以下代码尝试使用输出设置 GLKBaseEffect 纹理,但是我得到的只是黑色。我应该怎么做才能让它发挥作用?

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer (CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection {

CVPixelBufferRef pixelBuffer = (CVPixelBufferRef)CMSampleBufferGetImageBuffer(sampleBuffer);

effect.texture2d0.name = CVOpenGLESTextureGetName(pixelBuffer);
}

最佳答案

TLDR:我认为您不能将相机输出与 GLKBaseEffect 一起使用 - 来自相机的数据是双平面 YUV 格式,因此您需要自定义片段着色器在渲染时将其转换为 RGB,GLKBaseEffect 不执行自定义着色器。

这里似乎有一些 API 困惑,所以如果您想了解更多背景知识,请继续阅读...

尽管 CVOpenGLESTexture 类型派生自 CVPixelBuffer,但您从 CMSampleBufferGetImageBuffer 获取的图像缓冲区不会自动成为 OpenGL ES 纹理。每次使用 CVOpenGLESTextureCache 从相机获取帧时,您都需要从图像缓冲区创建纹理。

Apple 的 GLCameraRipple示例代码说明了如何执行此操作。这是一个快速概述:

  1. 设置 GL 上下文后,setupAVCapture 方法调用 CVOpenGLESTextureCacheCreate 以创建绑定(bind)到该上下文的纹理缓存。
  2. captureOutput:didOutputSampleBuffer:fromConnection: 中,他们使用 CMSampleBufferGetImageBuffer 从样本缓冲区获取图像缓冲区,然后使用纹理缓存的 CVOpenGLESTextureCacheCreateTextureFromImage 函数。您需要两个纹理,因为图像缓冲区在两个位平面中具有 YUV 颜色数据。
  3. 每个纹理在创建后立即使用 glBindTexture 进行渲染。一般来说,您可以通过设置 GLKBaseEffecttexture2d0.name 并告诉它 prepareToDraw 来替换 glBindTexture 调用, 但 GLKBaseEffect 无法呈现 YUV。
  4. 使用两个绑定(bind)纹理绘制,使用着色器程序,其片段着色器首先通过组合 Y 和 UV 纹理的分量生成 YUV 矢量,然后进行简单的矩阵乘法以根据 HDTV 将其转换为 RGB 像素颜色色彩空间规范。

因为 YUV 到 RGB 转换需要自定义片段着色器,GLKBaseEffect 不会帮助您。然而,正如 GLCameraRipple 示例所示,您需要编写的自定义着色器并不那么可怕。

关于iOS GLKit : set GLKBaseEffect texture with camera output,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22001349/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com