繁体   English   中英

iOS GLKit:使用相机输出设置GLKBaseEffect纹理

[英]iOS GLKit: set GLKBaseEffect texture with camera output

我已经建立了一个AVCapture会话,并在委托方法中,使用以下代码尝试通过输出设置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派生的, CVPixelBuffer CMSampleBufferGetImageBuffer返回的图像缓冲区并不是自动的OpenGL ES纹理。 每次使用CVOpenGLESTextureCache从相机获取一帧时,都需要从图像缓冲区创建纹理。

苹果的GLCameraRipple示例代码说明了如何执行此操作。 快速概览:

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

因为您需要用于YUV到RGB转换的自定义片段着色器,所以GLKBaseEffect无法为您提供帮助。 但是,如GLCameraRipple示例所示,您需要编写的自定义着色器并不是那么可怕。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM