【问题标题】:OpenGLES 3 Error at CVOpenGLESTextureCacheCreateTextureFromImage -6683CVOpenGLESTextureCacheCreateTextureFromImage 处的 OpenGLES 3 错误 -6683
【发布时间】:2016-07-12 20:36:17
【问题描述】:

我从 [_videoOutput copyPixelBufferForItemTime:[_playerItem currentTime] itemTimeForDisplay:nil] 收到 CVPixelBuffer;我将此像素缓冲区传输到 CVOpenGLESTextureCacheCreateTextureFromImage 函数以创建亮度纹理或铬纹理

// Y-plane
glActiveTexture(GL_TEXTURE0);
err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault,_videoTextureCache, pixelBuffer, NULL, GL_TEXTURE_2D, GL_RED_EXT,width, height, GL_RED_EXT, GL_UNSIGNED_BYTE, 0, &outTexture);
if (err) {
    NSLog(@"Error at CVOpenGLESTextureCacheCreateTextureFromImage %d", err);
}

当我使用 OpenGLES 2.0 时,它可以工作,但更改为 OpenGLES 3.0,它会失败并打印一些错误,如下所示:

CVOpenGLESTextureCacheCreateTextureFromImage 出错 -6683 创建 IOSurface 图像(纹理)失败

OpenGLES 3.0/2.0 代码:

_context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES3];

if (!_context) {
    _context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
    if (!_context) {
        NSLog(@"Failed to create ES context");
    }
    _openGLESVer = OpenGLESVersion2;
}

【问题讨论】:

    标签: ios opengl-es


    【解决方案1】:

    使用 OpenGL ES 3.0 时,您需要将 GL_RED_EXT 替换为 GL_LUMINANCE,考虑下面的代码(我在一年前的应用程序中使用它),它应该只工作 pixelBuffer 是 yuv420sp 是否已满范围或视频范围。请注意,CVOpenGLESTextureCacheCreateTextureFromImage 不适用于 yuv420p。 // Y-plane glActiveTexture(GL_TEXTURE0); err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault,_videoTextureCache, pixelBuffer, NULL, GL_TEXTURE_2D, GL_LUMINANCE,width, height, GL_LUMINANCE, GL_UNSIGNED_BYTE, 0, &outTexture);

    【讨论】:

    • 核心视频中yuv420sp的常量是什么?
    猜你喜欢
    • 1970-01-01
    • 2023-03-03
    • 2015-09-11
    • 1970-01-01
    • 1970-01-01
    • 2013-02-18
    • 2016-12-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多