我正在使用 AVFoundation 来获取相机流。我正在使用此代码从以下位置获取 MTLTextures:
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection
{
CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
id<MTLTexture> texture = nil;
{
size_t width = CVPixelBufferGetWidth(pixelBuffer);
size_t height = CVPixelBufferGetHeight(pixelBuffer);
MTLPixelFormat pixelFormat = MTLPixelFormatBGRA8Unorm;
CVMetalTextureRef metalTextureRef = NULL;
CVReturn status = CVMetalTextureCacheCreateTextureFromImage(NULL, _textureCache, pixelBuffer, NULL, pixelFormat, width, height, 0, &metalTextureRef);
if(status == kCVReturnSuccess)
{
texture = CVMetalTextureGetTexture(metalTextureRef);
if (self.delegate){
[self.delegate textureUpdated:texture];
}
CFRelease(metalTextureRef);
}
}
}
它工作正常,除了生成的MTLTexture对象没有 mipmaped(只有一个 mip 级别)。在本次通话中:
CVMetalTextureCacheCreateTextureFromImage(NULL, _textureCache, pixelBuffer, NULL, pixelFormat, width, height, 0, &metalTextureRef);
还有第三个参数称为“ textureAtributes ”,我认为可以指定我想要 mipmaped 纹理,但我在文档中没有找到任何字词到底是什么。我也没有找到传递其他内容而不是 NULL 的源代码。
在iOS的OpenGLES中有类似的方法,具有相同的参数,并且文档中也没有文字。