Thật không may, thực sự không có bất kỳ tài liệu nào về các chức năng mới này. Điều tốt nhất bạn sẽ tìm thấy ngay bây giờ là trong file CVOpenGLESTextureCache.h
tiêu đề, nơi bạn sẽ thấy mô tả khái quát các thông số chức năng:
/*!
@function CVOpenGLESTextureCacheCreate
@abstract Creates a new Texture Cache.
@param allocator The CFAllocatorRef to use for allocating the cache. May be NULL.
@param cacheAttributes A CFDictionaryRef containing the attributes of the cache itself. May be NULL.
@param eaglContext The OpenGLES 2.0 context into which the texture objects will be created. OpenGLES 1.x contexts are not supported.
@param textureAttributes A CFDictionaryRef containing the attributes to be used for creating the CVOpenGLESTexture objects. May be NULL.
@param cacheOut The newly created texture cache will be placed here
@result Returns kCVReturnSuccess on success
*/
CV_EXPORT CVReturn CVOpenGLESTextureCacheCreate(
CFAllocatorRef allocator,
CFDictionaryRef cacheAttributes,
void *eaglContext,
CFDictionaryRef textureAttributes,
CVOpenGLESTextureCacheRef *cacheOut) __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_5_0);
Các yếu tố khó khăn hơn là những bộ từ điển thuộc tính, mà tiếc là bạn cần để tìm các ví dụ để sử dụng các chức năng này đúng cách. Apple có các ví dụ GLCameraRipple và RosyWriter hiển thị cách sử dụng đường dẫn tải lên kết cấu nhanh với định dạng màu nhập của BGRA và YUV. Apple cũng cung cấp ví dụ ChromaKey tại WWDC (có thể vẫn có thể truy cập được cùng với các video) đã chứng minh cách sử dụng các bộ đệm kết cấu này để lấy thông tin từ kết cấu OpenGL ES.
Tôi vừa tải lên kết cấu nhanh này hoạt động trong khung GPUImage của mình (mã nguồn có sẵn tại liên kết đó), vì vậy, tôi sẽ trình bày những gì tôi có thể phân tích trong số này. Trước tiên, tôi tạo bộ nhớ cache kết cấu bằng cách sử dụng mã sau:
CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, (__bridge void *)[[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context], NULL, &coreVideoTextureCache);
if (err)
{
NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreate %d");
}
trong đó ngữ cảnh được gọi là EAGLCtext được định cấu hình cho OpenGL ES 2.0.
Tôi sử dụng này để giữ cho khung hình video từ camera trên thiết bị iOS trong bộ nhớ video, và tôi sử dụng đoạn mã sau để làm điều này:
CVPixelBufferLockBaseAddress(cameraFrame, 0);
CVOpenGLESTextureRef texture = NULL;
CVReturn err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, coreVideoTextureCache, cameraFrame, NULL, GL_TEXTURE_2D, GL_RGBA, bufferWidth, bufferHeight, GL_BGRA, GL_UNSIGNED_BYTE, 0, &texture);
if (!texture || err) {
NSLog(@"CVOpenGLESTextureCacheCreateTextureFromImage failed (error: %d)", err);
return;
}
outputTexture = CVOpenGLESTextureGetName(texture);
glBindTexture(GL_TEXTURE_2D, outputTexture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
// Do processing work on the texture data here
CVPixelBufferUnlockBaseAddress(cameraFrame, 0);
CVOpenGLESTextureCacheFlush(coreVideoTextureCache, 0);
CFRelease(texture);
outputTexture = 0;
này tạo ra một CVOpenGLESTextureRef mới, đại diện cho một kết cấu OpenGL ES, từ bộ đệm kết cấu. Kết cấu này dựa trên CVImageBufferRef được máy ảnh truyền vào. Kết cấu đó sau đó được lấy từ CVOpenGLESTextureRef và các tham số thích hợp được thiết lập cho nó (có vẻ như cần thiết trong quá trình xử lý của tôi). Cuối cùng, tôi làm công việc của mình trên texture và dọn dẹp khi tôi hoàn thành.
Quá trình tải lên nhanh này tạo sự khác biệt thực sự trên thiết bị iOS. Nó đã tải lên và xử lý một khung hình duy nhất 640x480 video trên iPhone 4S từ 9,0 ms đến 1,8 ms.
Tôi cũng có heard that this works in reverse, điều này có thể cho phép thay thế glReadPixels()
trong một số trường hợp nhất định, nhưng tôi chưa thử điều này.
Nó thực sự là một sự xấu hổ rằng một cách hiệu quả để xử lý hình ảnh không phải là tài liệu rất tốt.Nhưng nhờ những người như bạn ít kinh nghiệm hơn, các nhà phát triển cũng có thể thử sử dụng nó. – Pochi
Bạn có thể lấy bộ đệm kết cấu làm việc cho ảnh cài sẵn không? Tôi không thể tìm thấy bất kỳ thông tin nào trên 'CFDictionaryRef cacheAttributes' cho' CVOpenGLESTextureCacheCreate' – Dex
@Dex - Có, tính năng này hoạt động với cài đặt trước ảnh có cùng cài đặt như tôi đã sử dụng cho khung hình video. Xem khuôn khổ được liên kết ở trên của tôi để biết mã với các tùy chọn tôi đã sử dụng. Một điều thận trọng là trên iPhone 4, máy ảnh có thể chụp các khung lớn hơn kích thước họa tiết tối đa trên thiết bị đó. Những ảnh này không thể được xử lý trực tiếp dưới dạng họa tiết, do đó, một số loại lát gạch sẽ là cần thiết để xử lý chúng. Tôi đang làm việc trên đó. –