亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

GPUImageAPI文檔之GPUImageContext類

2019-11-14 17:55:32
字體:
來源:轉載
供稿:網友

  GPUImageContext類,提供OpenGL ES基本環境,我們一般不會用到,所以講的很簡單。

  屬性

  @PRoperty(readonly, nonatomic) dispatch_queue_t contextQueue

  說明:創建一個context線程

  描述:_contextQueue = dispatch_queue_create("com.sunsetlakesoftware.GPUImage.openGLESContextQueue", NULL);

 

  @property(readwrite, retain, nonatomic) GLProgram *currentShaderProgram

  說明:當前著色器program

 

  @property(readonly, retain, nonatomic) EAGLContext *context

  說明:opengl es繪制環境,管理上下文

 

  方法

    + (void *)contextKey

    說明:設置當前context的線程標識符,全局靜態變量。

  

    + (GPUImageContext *)sharedImageProcessingContext

    說明:創建一個全局的GPUImageContext對象的單例。

 

    + (dispatch_queue_t)sharedContextQueue

    說明:創建一個context queue單例

 

    + (GPUImageFramebufferCache *)sharedFramebufferCache

    說明:創建一個GPUFramebufferCache單例

     

    - (void)useAsCurrentContext

    說明:使用當前context

 

    + (void)setActiveShaderProgram:(GLProgram *)shaderProgram;

    - (void)setContextShaderProgram:(GLProgram *)shaderProgram;

    + (GLint)maximumTextureSizeForThisDevice;

    + (GLint)maximumTextureUnitsForThisDevice;

    + (GLint)maximumVaryingVectorsForThisDevice;

    + (BOOL)deviceSupportsOpenGLESExtension:(NSString *)extension;

    + (BOOL)deviceSupportsRedTextures;

    + (BOOL)deviceSupportsFramebufferReads;

    + (CGSize)sizeThatFitsWithinATextureForSize:(CGSize)inputSize;

    - (void)presentBufferForDisplay;

    - (GLProgram *)programForVertexShaderString:(NSString *)vertexShaderString fragmentShaderString:(NSString *)fragmentShaderString;

    - (void)useSharegroup:(EAGLSharegroup *)sharegroup;

    + (BOOL)supportsFastTextureUpload;

 

完整代碼

#import "GLProgram.h"#import "GPUImageFramebuffer.h"#import "GPUImageFramebufferCache.h"#define GPUImageRotationSwapsWidthAndHeight(rotation) ((rotation) == kGPUImageRotateLeft || (rotation) == kGPUImageRotateRight || (rotation) == kGPUImageRotateRightFlipVertical || (rotation) == kGPUImageRotateRightFlipHorizontal)typedef enum { kGPUImageNoRotation, kGPUImageRotateLeft, kGPUImageRotateRight, kGPUImageFlipVertical, kGPUImageFlipHorizonal, kGPUImageRotateRightFlipVertical, kGPUImageRotateRightFlipHorizontal, kGPUImageRotate180 } GPUImageRotationMode;@interface GPUImageContext : NSObject@property(readonly, nonatomic) dispatch_queue_t contextQueue;@property(readwrite, retain, nonatomic) GLProgram *currentShaderProgram;@property(readonly, retain, nonatomic) EAGLContext *context;@property(readonly) CVOpenGLESTextureCacheRef coreVideoTextureCache;@property(readonly) GPUImageFramebufferCache *framebufferCache;+ (void *)contextKey;+ (GPUImageContext *)sharedImageProcessingContext;+ (dispatch_queue_t)sharedContextQueue;+ (GPUImageFramebufferCache *)sharedFramebufferCache;+ (void)useImageProcessingContext;- (void)useAsCurrentContext;+ (void)setActiveShaderProgram:(GLProgram *)shaderProgram;- (void)setContextShaderProgram:(GLProgram *)shaderProgram;+ (GLint)maximumTextureSizeForThisDevice;+ (GLint)maximumTextureUnitsForThisDevice;+ (GLint)maximumVaryingVectorsForThisDevice;+ (BOOL)deviceSupportsOpenGLESExtension:(NSString *)extension;+ (BOOL)deviceSupportsRedTextures;+ (BOOL)deviceSupportsFramebufferReads;+ (CGSize)sizeThatFitsWithinATextureForSize:(CGSize)inputSize;- (void)presentBufferForDisplay;- (GLProgram *)programForVertexShaderString:(NSString *)vertexShaderString fragmentShaderString:(NSString *)fragmentShaderString;- (void)useSharegroup:(EAGLSharegroup *)sharegroup;// Manage fast texture upload+ (BOOL)supportsFastTextureUpload;@end@protocol GPUImageInput <NSObject>- (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex;- (void)setInputFramebuffer:(GPUImageFramebuffer *)newInputFramebuffer atIndex:(NSInteger)textureIndex;- (NSInteger)nextAvailableTextureIndex;- (void)setInputSize:(CGSize)newSize atIndex:(NSInteger)textureIndex;- (void)setInputRotation:(GPUImageRotationMode)newInputRotation atIndex:(NSInteger)textureIndex;- (CGSize)maximumOutputSize;- (void)endProcessing;- (BOOL)shouldIgnoreUpdatesToThisTarget;- (BOOL)enabled;- (BOOL)wantsMonoChromeInput;- (void)setCurrentlyReceivingMonochromeInput:(BOOL)newValue;@end
View Code

 

#import "GPUImageContext.h"#import <OpenGLES/EAGLDrawable.h>#import <AVFoundation/AVFoundation.h>#define MAXSHADERPROGRAMSALLOWEDINCACHE 40@interface GPUImageContext(){    NSMutableDictionary *shaderProgramCache;    NSMutableArray *shaderProgramUsageHistory;    EAGLSharegroup *_sharegroup;}@end@implementation GPUImageContext@synthesize context = _context;@synthesize currentShaderProgram = _currentShaderProgram;@synthesize contextQueue = _contextQueue;@synthesize coreVideoTextureCache = _coreVideoTextureCache;@synthesize framebufferCache = _framebufferCache;static void *openGLESContextQueueKey;- (id)init;{    if (!(self = [super init]))    {        return nil;    }    openGLESContextQueueKey = &openGLESContextQueueKey;    _contextQueue = dispatch_queue_create("com.sunsetlakesoftware.GPUImage.openGLESContextQueue", NULL);    #if OS_OBJECT_USE_OBJC    dispatch_queue_set_specific(_contextQueue, openGLESContextQueueKey, (__bridge void *)self, NULL);#endif    shaderProgramCache = [[NSMutableDictionary alloc] init];    shaderProgramUsageHistory = [[NSMutableArray alloc] init];        return self;}+ (void *)contextKey {    return openGLESContextQueueKey;}// Based on Colin Wheeler's example here: http://cocoasamurai.blogspot.com/2011/04/singletons-your-doing-them-wrong.html+ (GPUImageContext *)sharedImageProcessingContext;{    static dispatch_once_t pred;    static GPUImageContext *sharedImageProcessingContext = nil;        dispatch_once(&pred, ^{        sharedImageProcessingContext = [[[self class] alloc] init];    });    return sharedImageProcessingContext;}+ (dispatch_queue_t)sharedContextQueue;{    return [[self sharedImageProcessingContext] contextQueue];}+ (GPUImageFramebufferCache *)sharedFramebufferCache;{    return [[self sharedImageProcessingContext] framebufferCache];}+ (void)useImageProcessingContext;{    [[GPUImageContext sharedImageProcessingContext] useAsCurrentContext];}- (void)useAsCurrentContext;{    EAGLContext *imageProcessingContext = [self context];    if ([EAGLContext currentContext] != imageProcessingContext)    {        [EAGLContext setCurrentContext:imageProcessingContext];    }}+ (void)setActiveShaderProgram:(GLProgram *)shaderProgram;{    GPUImageContext *sharedContext = [GPUImageContext sharedImageProcessingContext];    [sharedContext setContextShaderProgram:shaderProgram];}- (void)setContextShaderProgram:(GLProgram *)shaderProgram;{    EAGLContext *imageProcessingContext = [self context];    if ([EAGLContext currentContext] != imageProcessingContext)    {        [EAGLContext setCurrentContext:imageProcessingContext];    }        if (self.currentShaderProgram != shaderProgram)    {        self.currentShaderProgram = shaderProgram;        [shaderProgram use];    }}+ (GLint)maximumTextureSizeForThisDevice;{    static dispatch_once_t pred;    static GLint maxTextureSize = 0;        dispatch_once(&pred, ^{        [self useImageProcessingContext];        glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxTextureSize);    });    return maxTextureSize;}+ (GLint)maximumTextureUnitsForThisDevice;{    static dispatch_once_t pred;    static GLint maxTextureUnits = 0;    dispatch_once(&pred, ^{        [self useImageProcessingContext];        glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &maxTextureUnits);    });        return maxTextureUnits;}+ (GLint)maximumVaryingVectorsForThisDevice;{    static dispatch_once_t pred;    static GLint maxVaryingVectors = 0;    dispatch_once(&pred, ^{        [self useImageProcessingContext];        glGetIntegerv(GL_MAX_VARYING_VECTORS, &maxVaryingVectors);    });    return maxVaryingVectors;}+ (BOOL)deviceSupportsOpenGLESExtension:(NSString *)extension;{    static dispatch_once_t pred;    static NSArray *extensionNames = nil;    // Cache extensions for later quick reference, since this won't change for a given device    dispatch_once(&pred, ^{        [GPUImageContext useImageProcessingContext];        NSString *extensionsString = [NSString stringWithCString:(const char *)glGetString(GL_EXTENSIONS) encoding:NSASCIIStringEncoding];        extensionNames = [extensionsString componentsSeparatedByString:@" "];    });    return [extensionNames containsObject:extension];}// http://www.khronos.org/registry/gles/extensions/EXT/EXT_texture_rg.txt+ (BOOL)deviceSupportsRedTextures;{    static dispatch_once_t pred;    static BOOL supportsRedTextures = NO;        dispatch_once(&pred, ^{        supportsRedTextures = [GPUImageContext deviceSupportsOpenGLESExtension:@"GL_EXT_texture_rg"];    });        return supportsRedTextures;}+ (BOOL)deviceSupportsFramebufferReads;{    static dispatch_once_t pred;    static BOOL supportsFramebufferReads = NO;        dispatch_once(&pred, ^{        supportsFramebufferReads = [GPUImageContext deviceSupportsOpenGLESExtension:@"GL_EXT_shader_framebuffer_fetch"];    });        return supportsFramebufferReads;}+ (CGSize)sizeThatFitsWithinATextureForSize:(CGSize)inputSize;{    GLint maxTextureSize = [self maximumTextureSizeForThisDevice];     if ( (inputSize.width < maxTextureSize) && (inputSize.height < maxTextureSize) )    {        return inputSize;    }        CGSize adjustedSize;    if (inputSize.width > inputSize.height)    {        adjustedSize.width = (CGFloat)maxTextureSize;        adjustedSize.height = ((CGFloat)maxTextureSize / inputSize.width) * inputSize.height;    }    else    {        adjustedSize.height = (CGFloat)maxTextureSize;        adjustedSize.width = ((CGFloat)maxTextureSize / inputSize.height) * inputSize.width;    }    return adjustedSize;}- (void)presentBufferForDisplay;{    [self.context presentRenderbuffer:GL_RENDERBUFFER];}- (GLProgram *)programForVertexShaderString:(NSString *)vertexShaderString fragmentShaderString:(NSString *)fragmentShaderString;{    NSString *lookupKeyForShaderProgram = [NSString stringWithFormat:@"V: %@ - F: %@", vertexShaderString, fragmentShaderString];    GLProgram *programFromCache = [shaderProgramCache objectForKey:lookupKeyForShaderProgram];    if (programFromCache == nil)    {        programFromCache = [[GLProgram alloc] initWithVertexShaderString:vertexShaderString fragmentShaderString:fragmentShaderString];        [shaderProgramCache setObject:programFromCache forKey:lookupKeyForShaderProgram];//        [shaderProgramUsageHistory addObject:lookupKeyForShaderProgram];//        if ([shaderProgramUsageHistory count] >= MAXSHADERPROGRAMSALLOWEDINCACHE)//        {//            for (NSUInteger currentShaderProgramRemovedFromCache = 0; currentShaderProgramRemovedFromCache < 10; currentShaderProgramRemovedFromCache++)//            {//                NSString *shaderProgramToRemoveFromCache = [shaderProgramUsageHistory objectAtIndex:0];//                [shaderProgramUsageHistory removeObjectAtIndex:0];//                [shaderProgramCache removeObjectForKey:shaderProgramToRemoveFromCache];//            }//        }    }        return programFromCache;}- (void)useSharegroup:(EAGLSharegroup *)sharegroup;{    NSAssert(_context == nil, @"Unable to use a share group when the context has already been created. Call this method before you use the context for the first time.");        _sharegroup = sharegroup;}- (EAGLContext *)createContext;{    EAGLContext *context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2 sharegroup:_sharegroup];    NSAssert(context != nil, @"Unable to create an OpenGL ES 2.0 context. The GPUImage framework requires OpenGL ES 2.0 support to work.");    return context;}#pragma mark -#pragma mark Manage fast texture upload+ (BOOL)supportsFastTextureUpload;{#if TARGET_IPHONE_SIMULATOR    return NO;#else    #pragma clang diagnostic push#pragma clang diagnostic ignored "-Wtautological-pointer-compare"    return (CVOpenGLESTextureCacheCreate != NULL);#pragma clang diagnostic pop#endif}#pragma mark -#pragma mark accessors- (EAGLContext *)context;{    if (_context == nil)    {        _context = [self createContext];        [EAGLContext setCurrentContext:_context];                // Set up a few global settings for the image processing pipeline        glDisable(GL_DEPTH_TEST);    }        return _context;}- (CVOpenGLESTextureCacheRef)coreVideoTextureCache;{    if (_coreVideoTextureCache == NULL)    {#if defined(__IPHONE_6_0)        CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, [self context], NULL, &_coreVideoTextureCache);#else        CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, (__bridge void *)[self context], NULL, &_coreVideoTextureCache);#endif                if (err)        {            NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreate %d", err);        }    }        return _coreVideoTextureCache;}- (GPUImageFramebufferCache *)framebufferCache;{    if (_framebufferCache == nil)    {        _framebufferCache = [[GPUImageFramebufferCache alloc] init];    }        return _framebufferCache;}@end
View Code

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
51精品在线观看| 亚洲精品电影网在线观看| 亚洲国产又黄又爽女人高潮的| 精品一区二区亚洲| 成人www视频在线观看| 日韩av最新在线观看| 亚洲精品一区中文| 成人免费网站在线观看| 91在线免费观看网站| 亚洲精品日韩激情在线电影| 2019国产精品自在线拍国产不卡| 黑人巨大精品欧美一区二区免费| 91精品国产91久久久久久最新| 热re91久久精品国99热蜜臀| 亚洲自拍欧美色图| 久久久久久com| 日韩视频欧美视频| 国产亚洲精品久久久优势| 成人黄色在线播放| 91成品人片a无限观看| 亚洲国产女人aaa毛片在线| 欧美国产日产韩国视频| 国产精品啪视频| 久久综合伊人77777尤物| 欧美特黄级在线| 欧美亚洲一级片| 精品久久久精品| 亚洲福利在线看| 精品国产乱码久久久久久虫虫漫画| 亚洲精品久久视频| 欧美有码在线视频| 亚洲乱亚洲乱妇无码| 成人国产精品免费视频| 96pao国产成视频永久免费| 亚洲国产精品久久久久秋霞不卡| 国产成人久久久精品一区| 久久久精品999| 91网在线免费观看| 青草成人免费视频| 亚洲精品videossex少妇| 亚洲视频在线播放| 亚洲香蕉av在线一区二区三区| 色婷婷久久av| 亚洲国产成人在线播放| 国产精品旅馆在线| www.欧美免费| 国产精品亚洲综合天堂夜夜| 九九热精品视频| 亚洲片国产一区一级在线观看| 久久久噜噜噜久久| 中文字幕日韩精品有码视频| 欧美激情欧美激情在线五月| 日本a级片电影一区二区| 日韩视频在线免费观看| 毛片精品免费在线观看| 懂色av影视一区二区三区| 日韩欧美国产成人| 国内免费久久久久久久久久久| 亚洲成色www8888| 81精品国产乱码久久久久久| 欧美精品制服第一页| 国产欧美精品一区二区| 亚洲人成电影在线观看天堂色| 精品五月天久久| 久久久免费精品| 亚洲国产精品va在线观看黑人| 日韩电影免费观看在线观看| 在线观看国产精品淫| 国产精品盗摄久久久| 日韩欧美在线播放| 欧美老少做受xxxx高潮| 精品少妇一区二区30p| 亚洲自拍偷拍福利| 97超级碰碰碰久久久| 欧美日韩中文字幕在线| 亚洲欧洲激情在线| 欧美美女15p| 欧美—级高清免费播放| 日韩av中文字幕在线免费观看| 亚洲精品电影网站| 亚洲一区二区三区香蕉| 欧美性猛交xxxx乱大交3| 国产裸体写真av一区二区| 精品国内自产拍在线观看| 亚洲午夜久久久久久久| 欧美亚洲国产精品| 久久夜色精品亚洲噜噜国产mv| 一本一本久久a久久精品牛牛影视| 亚洲视频一区二区三区| 91在线视频导航| 欧美成人免费观看| 国产精品露脸av在线| www.欧美视频| 狠狠色狠色综合曰曰| 九九热最新视频//这里只有精品| 国产欧美 在线欧美| 97视频免费观看| 久久久久中文字幕2018| 久久99久久久久久久噜噜| 亚洲国产精品国自产拍av秋霞| 欧美国产在线电影| 国产精品av在线| 久久亚洲精品小早川怜子66| 久久精品这里热有精品| 欧美日韩一区二区免费视频| 亚洲第一精品久久忘忧草社区| 精品色蜜蜜精品视频在线观看| 欧美自拍视频在线| 国产精品久久久久久久久影视| 亚洲国产欧美在线成人app| 久久免费视频这里只有精品| 成人免费午夜电影| 国产精品一区av| 91精品国产色综合| 国产精品尤物福利片在线观看| 欧美极品欧美精品欧美视频| 日韩精品在线观看一区| 欧美日韩午夜视频在线观看| 日韩中文字幕在线观看| 国产精品成人aaaaa网站| 992tv成人免费影院| 国产精品久久久| 久久久久北条麻妃免费看| 欧美综合在线第二页| 国产精品999| 久久久精品美女| 成人免费在线网址| 亚洲国产欧美一区二区三区久久| 日韩中文字幕在线视频| 久久九九有精品国产23| 日韩av网站在线| 日韩精品极品视频| 亚洲第一级黄色片| 精品伊人久久97| 欧美成人午夜激情| 久久久久久国产精品三级玉女聊斋| 亚洲激情电影中文字幕| 久久免费视频网| 欧美日韩在线视频观看| 美日韩丰满少妇在线观看| 欧美网站在线观看| 国产日韩在线看片| 97视频在线观看网址| 精品中文视频在线| 亚洲人av在线影院| 国内精品久久久久久影视8| 国产精品久久久久久久9999| 久久综合免费视频影院| 日韩免费观看高清| 亚洲欧美一区二区三区在线| 欧美精品video| 国产成人精品一区二区在线| 久久久伊人日本| 成人免费高清完整版在线观看| 午夜精品在线视频| 亚洲精品国产精品久久清纯直播| 国产999精品久久久影片官网| 国产精品无av码在线观看| 伦理中文字幕亚洲| 自拍亚洲一区欧美另类| 欧美香蕉大胸在线视频观看| 青青草精品毛片| 亚洲人永久免费| 亚洲国产高清高潮精品美女|