简体   繁体   English

`CVOpenGLESTextureCache` 是我用错了吗?

[英]`CVOpenGLESTextureCache` Am I using it wrong ?

refer to GPUImage , i use frameBufferCache to reuse framebuffer.参考GPUImage ,我使用 frameBufferCache 来重用帧缓冲区。

use CVOpenGLESTextureCacheCreateTextureFromImage() to create new framebuffer使用CVOpenGLESTextureCacheCreateTextureFromImage()创建新的帧缓冲区

CVOpenGLESTextureCacheRef coreVideoTextureCache = [WDContext shareImageContext].glTextureCache;
            

            CFDictionaryRef empty; // empty value for attr value.
            CFMutableDictionaryRef attrs;
            empty = CFDictionaryCreate(kCFAllocatorDefault,
                                       NULL,
                                       NULL,
                                       0,
                                       &kCFTypeDictionaryKeyCallBacks,
                                       &kCFTypeDictionaryValueCallBacks); // our empty IOSurface properties dictionary
            attrs = CFDictionaryCreateMutable(kCFAllocatorDefault,
                                              1,
                                              &kCFTypeDictionaryKeyCallBacks,
                                              &kCFTypeDictionaryValueCallBacks);
            CFDictionarySetValue(attrs, kCVPixelBufferIOSurfacePropertiesKey, empty);

            CVReturn err = CVPixelBufferCreate(kCFAllocatorDefault,
                                               (int) self->_size.width,
                                               (int) self->_size.height,
                                               kCVPixelFormatType_32BGRA,
                                               attrs,
                                               &self->renderTarget);
            if (err) {
                NSLog(@"FBO size: %f, %f", self->_size.width, self->_size.height);
                NSAssert(NO, @"Error at CVPixelBufferCreate %d", err);
            }

            err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault,
                                                               coreVideoTextureCache,
                                                               self->renderTarget,
                                                               NULL, // texture attributes
                                                               GL_TEXTURE_2D,
                                                               self->_textureOptions.internalFormat, // opengl format
                                                               (int) self->_size.width,
                                                               (int) self->_size.height,
                                                               self->_textureOptions.format, // native iOS format
                                                               self->_textureOptions.type,
                                                               0,
                                                               &self->renderTexture);
            if (err) {
                NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreateTextureFromImage %d", err);
            }

            CFRelease(attrs);
            CFRelease(empty);

            glBindTexture(CVOpenGLESTextureGetTarget(self->renderTexture), CVOpenGLESTextureGetName(self->renderTexture));
            self->_texture = CVOpenGLESTextureGetName(self->renderTexture);
            glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, self->_textureOptions.wrapS);
            glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, self->_textureOptions.wrapT);

            glFramebufferTexture2D(GL_FRAMEBUFFER,
                                   GL_COLOR_ATTACHMENT0,
                                   GL_TEXTURE_2D,
                                   CVOpenGLESTextureGetName(self->renderTexture),
                                   0);

when framebuffer is no use,then return to cache for reuse later.当 framebuffer 没有用时,返回缓存以备后用。

and in my program,i also need to decode the video, and convert YUV format pixelBuffer to RGB texture在我的程序中,我还需要对视频进行解码,并将YUV格式的pixelBuffer转换为RGB纹理

CVOpenGLESTextureRef luminanceTextureRef = NULL;
                    CVOpenGLESTextureRef chrominanceTextureRef = NULL;
                    
                    glActiveTexture(GL_TEXTURE4);
                    err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault,
                                                                       [WDGLContext shareImageContext].glTextureCache,
                                                                       pixelBuffer,
                                                                       NULL,
                                                                       GL_TEXTURE_2D,
                                                                       GL_LUMINANCE,
                                                                       w,
                                                                       h,
                                                                       GL_LUMINANCE,
                                                                       GL_UNSIGNED_BYTE,
                                                                       0,
                                                                       &luminanceTextureRef);
                    
                    glBindTexture(GL_TEXTURE_2D, CVOpenGLESTextureGetName(luminanceTextureRef));
                    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
                    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
                    
                    if (err) {
                        WDMKLog(@"YUV Make Texture Error at CVOpenGLESTextureCacheCreateTextureFromImage %d", err);
                    }
                    
                    glActiveTexture(GL_TEXTURE5);
                    err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault,
                                                                       [WDGLContext shareImageContext].glTextureCache,
                                                                       pixelBuffer,
                                                                       NULL,
                                                                       GL_TEXTURE_2D,
                                                                       GL_LUMINANCE_ALPHA,
                                                                       w / 2,
                                                                       h / 2,
                                                                       GL_LUMINANCE_ALPHA,
                                                                       GL_UNSIGNED_BYTE,
                                                                       1,
                                                                       &chrominanceTextureRef);
                    if (err) {
                        WDMKLog(@"YUV Make Texture Error at CVOpenGLESTextureCacheCreateTextureFromImage %d", err);
                    }
                    
                    glBindTexture(GL_TEXTURE_2D, CVOpenGLESTextureGetName(chrominanceTextureRef));
                    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
                    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

the problem is when i have framebuffer reused from cache in other process, then the luminance or chrominance texture created by CVOpenGLESTextureCacheCreateTextureFromImage is not correct问题是当我在其他进程中从缓存中重用帧缓冲区时, CVOpenGLESTextureCacheCreateTextureFromImage创建的亮度或色度纹理不正确

if all framebuffer are new, not from cache,then there is no problem.如果所有的帧缓冲区都是新的,而不是来自缓存,那么就没有问题。

i have no idea What does it matter about framebuffer cache, The only common point is that both use CVOpenGLESTextureCache .我不知道 framebuffer 缓存有什么关系,唯一的共同点是两者都使用CVOpenGLESTextureCache

so, am I using it wrong ?所以,我用错了吗?

i am puzzled by this question for a long time, anyone can help?被这个问题困惑了很久,请问有大佬帮忙解答一下吗? thank you谢谢你

Sorry,opengl operation was right,there were problems elsewhere.不好意思,opengl运行没问题,其他地方有问题。

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

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