gpt4 book ai didi

ios - 无法将相机源渲染为 OpenGL 纹理 (iOS)

转载 作者:行者123 更新时间:2023-11-29 12:54:28 28 4
gpt4 key购买 nike

我花了几天时间试图解决这个问题,但没有成功。

我正在尝试将相机提要渲染到 OpenGL 纹理。我设法在不使用 CVOpenGLESTextureCacheCreateTextureFromImage 的情况下使其工作,只需从 sampleBuffer 中创建 CGImage 即可。我有一些非常糟糕的表现,我需要使用缓存。

作为引用,我使用了 RosyWriter例子。我改变了大约几十次,但这就是我现在得到的,在我看来这只是示例,但更加简化。

我不会粘贴 AV 设置代码(如果需要我可以)。这是委托(delegate)方法实现:

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection
{
CVImageBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
size_t frameWidth = CVPixelBufferGetWidth(pixelBuffer);
size_t frameHeight = CVPixelBufferGetHeight(pixelBuffer);
CVOpenGLESTextureRef texture = NULL;
CVReturn err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault,
videoTextureCache,
pixelBuffer,
NULL,
GL_TEXTURE_2D,
GL_RGBA,
frameWidth,
frameHeight,
GL_BGRA,
GL_UNSIGNED_BYTE,
0,
&texture);


if (!texture || err) {
NSLog(@"CVOpenGLESTextureCacheCreateTextureFromImage failed (error: %d)", err);
return;
}
}

如您所见,我删除了预览队列(尝试使用它,但没有成功)以及我认为不必要的任何内容。

传递给函数的属性看起来没问题(pixelBuffer 有 iosurface,frameWidth/Height 是正确的)。

CVOpenGLESTextureCacheCreateTextureFromImage 日志

"Failed to create IOSurface image (texture)"

并返回一个错误

CVOpenGLESTextureCacheCreateTextureFromImage failed (error: -6683)

正如我所说,我尝试了很多东西,有不同的错误,有时只有黑色纹理。

我刚开始使用 OpenGL,所以它可能很明显,无论如何,如果有人看一下这个问题,那就太好了。我粘贴了我认为相关的代码,如果需要其他任何内容,我会更新。

更新

将此行添加到 AV 输出设置后,我不再收到错误,而是得到一个空白的黑色纹理。我怀疑它可能有颜色范围/格式的东西,有什么想法吗?

[output setVideoSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_32BGRA] forKey:(id)kCVPixelBufferPixelFormatTypeKey]];

最佳答案

好的所以更新中提到的行解决了错误。在那之后,我的图像一片空白,不知道该怎么办。我使用了新的 XCode 5 OpenGL 调试器(在调试窗口中捕获 OpenGL ES 帧)并看到有一个错误:

Texture #2 uses an unsupported wrap parameter or a non-power of two texture. Use GL_CLAMP_TO_EDGE instead, or resize the texture.

之后很清楚该怎么做,首先我通过添加更改了包装:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

出现了相机框架,但纹理没有更新。添加发布方法后,一切开始正常工作。

CFRelease(texture);
CVOpenGLESTextureCacheFlush(videoTextureCache, 0);

现在我不确定我是应该通过调整像素缓冲区的大小(可能会获得性能提升)来使纹理成为 2 的幂还是保持原样。

无论如何,希望这对某人有所帮助,因为我花了太多时间来解决这个问题。

关于ios - 无法将相机源渲染为 OpenGL 纹理 (iOS),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21501510/

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