[英]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
示例代码说明了如何执行此操作。 快速概览:
setupAVCapture
方法将调用CVOpenGLESTextureCacheCreate
来创建绑定到该上下文的纹理缓存。 captureOutput:didOutputSampleBuffer:fromConnection:
,他们使用CMSampleBufferGetImageBuffer
从样本缓冲区中获取图像缓冲区,然后使用纹理缓存的CVOpenGLESTextureCacheCreateTextureFromImage
函数从中创建两个OpenGL ES纹理。 您需要两个纹理,因为图像缓冲区在两个位平面中具有YUV颜色数据。 glBindTexture
创建后就必须进行渲染。 一般情况下,你可以更换glBindTexture
与呼叫设置GLKBaseEffect
的texture2d0.name
,它告诉给prepareToDraw
,但GLKBaseEffect
无法呈现YUV。 因为您需要用于YUV到RGB转换的自定义片段着色器,所以GLKBaseEffect
无法为您提供帮助。 但是,如GLCameraRipple
示例所示,您需要编写的自定义着色器并不是那么可怕。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.