简体   繁体   中英

`CVOpenGLESTextureCache` Am I using it wrong ?

refer to GPUImage , i use frameBufferCache to reuse framebuffer.

use CVOpenGLESTextureCacheCreateTextureFromImage() to create new framebuffer

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.

and in my program,i also need to decode the video, and convert YUV format pixelBuffer to RGB texture

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

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 .

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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