Use CVPixelBufferCreate if you intend to use CVPixelBufferRef with OpenGL. This creates an iosurface for you, as opposed to WithBytes alternatives. The disadvantage is that you cannot reuse existing buffers. You will have to copy data from existing buffers to the new allocated buffers.
// set pixel buffer attributes so we get an iosurface NSDictionary *pixelBufferAttributes = [NSDictionary dictionaryWithObjectsAndKeys: [NSDictionary dictionary], kCVPixelBufferIOSurfacePropertiesKey, nil]; // create planar pixel buffer CVPixelBufferRef pixelBuffer = nil; CVPixelBufferCreate(kCFAllocatorDefault, bufferYUV.width, bufferYUV.height, kCVPixelFormatType_420YpCbCr8BiPlanarFullRange, (CFDictionaryRef)pixelBufferAttributes, &pixelBuffer); // lock pixel buffer CVPixelBufferLockBaseAddress(pixelBuffer, 0); // get image details size_t width = CVPixelBufferGetWidth(pixelBuffer); size_t height = CVPixelBufferGetHeight(pixelBuffer); // get plane addresses unsigned char *baseAddressY = CVPixelBufferGetBaseAddressOfPlane(pixelBuffer, 0); unsigned char *baseAddressUV = CVPixelBufferGetBaseAddressOfPlane(pixelBuffer, 1); //TODO: copy your data buffers to the newly allocated memory locations // unlock pixel buffer address CVPixelBufferUnlockBaseAddress(pixelBuffer, 0); // intialize buffers if not already initialized (see GLCameraRipple example) if (!_buffersInitialized) { [self initializeBuffersWithTextureWidth:width textureHeight:height]; } // always clean up last textures CVReturn err; [self cleanUpTextures]; // 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, &_lumaTexture); if (err) { NSLog(@"Could not create Y texture from image. %d", err); } glBindTexture(CVOpenGLESTextureGetTarget(_lumaTexture), CVOpenGLESTextureGetName(_lumaTexture)); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); // UV-plane glActiveTexture(GL_TEXTURE1); err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, _videoTextureCache, pixelBuffer, NULL, GL_TEXTURE_2D, GL_RG_EXT, width / 2, height / 2, GL_RG_EXT, GL_UNSIGNED_BYTE, 1, &_chromaTexture); if (err) { NSLog(@"Could not create UV texture from image. %d", err); } glBindTexture(CVOpenGLESTextureGetTarget(_chromaTexture), CVOpenGLESTextureGetName(_chromaTexture)); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);