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

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

GPUImageAPI文檔之GLProgram類

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

  GLPRogram是GPUImage中代表openGL ES 中的program,具有glprogram功能。

  屬性

  @property(readwrite, nonatomic) BOOL initialized

   作用:該屬性用于指示program的初始化工作是否成功,成功返回YES,反之返回NO 

 

    @property(readwrite, copy, nonatomic) NSString *vertexShaderLog

    作用:該屬性用于設置或獲取頂點著色器的日志。

 

    @property(readwrite, copy, nonatomic) NSString *fragmentShaderLog

    作用:該屬性用于設置或獲取片段著色器的日志。

 

    @property(readwrite, copy, nonatomic) NSString *programLog

    作用:該屬性用于設置或獲取program的日志。

 

  方法

    - (id)initWithVertexShaderString:(NSString *)vShaderString fragmentShaderString:(NSString *)fShaderString

    說明:使用一個頂點著色字符串和一個片段著色字符串創建一個GLProgram對象

    參數:頂點著色字符串,片段著色字符串

    返回:GLProgram對象

    相似方法:- (id)initWithVertexShaderString:(NSString *)vShaderString fragmentShaderFilename:(NSString *)fShaderFilename;
         - (id)initWithVertexShaderFilename:(NSString *)vShaderFilename fragmentShaderFilename:(NSString *)fShaderFilename(從文件中讀取內容)

    實現

 

- (id)initWithVertexShaderString:(NSString *)vShaderString             fragmentShaderString:(NSString *)fShaderString;{    if ((self = [super init]))     {        _initialized = NO;                attributes = [[NSMutableArray alloc] init];        uniforms = [[NSMutableArray alloc] init];        program = glCreateProgram();                if (![self compileShader:&vertShader                             type:GL_VERTEX_SHADER                           string:vShaderString])        {            NSLog(@"Failed to compile vertex shader");        }                // Create and compile fragment shader        if (![self compileShader:&fragShader                             type:GL_FRAGMENT_SHADER                           string:fShaderString])        {            NSLog(@"Failed to compile fragment shader");        }                glAttachShader(program, vertShader);        glAttachShader(program, fragShader);    }        return self;}

    詳解:1.使用glCreateProgram()函數創建一個program

       2.編譯著色器

       3.附加著色器。glAttachShader(program, fragShader)

 

    - (void)addAttribute:(NSString *)attributeName

    說明:該方法用于向一個program對象中添加屬性

    參數:需要添加的屬性名稱

    返回:void

    實現:

 

- (void)addAttribute:(NSString *)attributeName{    if (![attributes containsObject:attributeName])    {        [attributes addObject:attributeName];        glBindAttribLocation(program,                              (GLuint)[attributes indexOfObject:attributeName],                             [attributeName UTF8String]);    }}

    詳解:void glBindAttribLocation( GLuint program, GLuint index,const GLchar *name)函數用來將屬性綁定到具體位置。program是使用的program對象,index是位置索引,*name是需要綁定的屬性名

 

    - (GLuint)attributeIndex:(NSString *)attributeName

    說明:返回具體屬性名的索引

    參數:指定的屬性名

    返回:指定屬性名的索引

 

    - (GLuint)uniformIndex:(NSString *)uniformName

    說明:返回Uniform的索引

    參數:指定的Uniform名

    返回:指定Uniform的索引

 

    - (BOOL)link

    說明:判斷program是否link成功

    返回:YES說明link成功,反之失敗

    實現:

    

- (BOOL)link{    GLint status;        glLinkProgram(program);        glGetProgramiv(program, GL_LINK_STATUS, &status);    if (status == GL_FALSE)        return NO;        if (vertShader)    {        glDeleteShader(vertShader);        vertShader = 0;    }    if (fragShader)    {        glDeleteShader(fragShader);        fragShader = 0;    }        self.initialized = YES;    return YES;}

 

    詳解:glLinkProgram(program)函數link一個創建好的program對象,glGetProgramiv(program, GL_LINK_STATUS, &status)用來查詢link結果。

 

    - (void)use

    說明:使用program

 

    
    - (void)validate

    說明:program對象是否有效

 

    - (BOOL)compileShader:(GLuint *)shader type:(GLenum)type string:(NSString *)shaderString

    說明:編譯著色器

    參數:shader是著色器   type為著色器類型(頂點和片段)  shaderString為著色器內容字符串。

    實現

    

- (BOOL)compileShader:(GLuint *)shader                  type:(GLenum)type                string:(NSString *)shaderString{//    CFAbsoluteTime startTime = CFAbsoluteTimeGetCurrent();    GLint status;    const GLchar *source;        source =       (GLchar *)[shaderString UTF8String];    if (!source)    {        NSLog(@"Failed to load vertex shader");        return NO;    }        *shader = glCreateShader(type);    glShaderSource(*shader, 1, &source, NULL);    glCompileShader(*shader);        glGetShaderiv(*shader, GL_COMPILE_STATUS, &status);    if (status != GL_TRUE)    {        GLint logLength;        glGetShaderiv(*shader, GL_INFO_LOG_LENGTH, &logLength);        if (logLength > 0)        {            GLchar *log = (GLchar *)malloc(logLength);            glGetShaderInfoLog(*shader, logLength, &logLength, log);            if (shader == &vertShader)            {                self.vertexShaderLog = [NSString stringWithFormat:@"%s", log];            }            else            {                self.fragmentShaderLog = [NSString stringWithFormat:@"%s", log];            }            free(log);        }    }        //    CFAbsoluteTime linkTime = (CFAbsoluteTimeGetCurrent() - startTime);//    NSLog(@"Compiled in %f ms", linkTime * 1000.0);    return status == GL_TRUE;}
#import <Foundation/Foundation.h>#if TARGET_ipHONE_SIMULATOR || TARGET_OS_IPHONE#import <OpenGLES/ES2/gl.h>#import <OpenGLES/ES2/glext.h>#else#import <OpenGL/OpenGL.h>#import <OpenGL/gl.h>#endif@interface GLProgram : NSObject {    NSMutableArray  *attributes;    NSMutableArray  *uniforms;    GLuint          program,    vertShader,     fragShader;    }@property(readwrite, nonatomic) BOOL initialized;@property(readwrite, copy, nonatomic) NSString *vertexShaderLog;@property(readwrite, copy, nonatomic) NSString *fragmentShaderLog;@property(readwrite, copy, nonatomic) NSString *programLog;- (id)initWithVertexShaderString:(NSString *)vShaderString             fragmentShaderString:(NSString *)fShaderString;- (id)initWithVertexShaderString:(NSString *)vShaderString           fragmentShaderFilename:(NSString *)fShaderFilename;- (id)initWithVertexShaderFilename:(NSString *)vShaderFilename             fragmentShaderFilename:(NSString *)fShaderFilename;- (void)addAttribute:(NSString *)attributeName;- (GLuint)attributeIndex:(NSString *)attributeName;- (GLuint)uniformIndex:(NSString *)uniformName;- (BOOL)link;- (void)use;- (void)validate;@end

 

#import "GLProgram.h"// START:typedefs#pragma mark Function Pointer Definitionstypedef void (*GLInfoFunction)(GLuint program, GLenum pname, GLint* params);typedef void (*GLLogFunction) (GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog);// END:typedefs#pragma mark -#pragma mark Private Extension Method Declaration// START:extension@interface GLProgram()- (BOOL)compileShader:(GLuint *)shader                  type:(GLenum)type                string:(NSString *)shaderString;@end// END:extension#pragma mark -@implementation GLProgram// START:init@synthesize initialized = _initialized;- (id)initWithVertexShaderString:(NSString *)vShaderString             fragmentShaderString:(NSString *)fShaderString;{    if ((self = [super init]))     {        _initialized = NO;                attributes = [[NSMutableArray alloc] init];        uniforms = [[NSMutableArray alloc] init];        program = glCreateProgram();                if (![self compileShader:&vertShader                             type:GL_VERTEX_SHADER                           string:vShaderString])        {            NSLog(@"Failed to compile vertex shader");        }                // Create and compile fragment shader        if (![self compileShader:&fragShader                             type:GL_FRAGMENT_SHADER                           string:fShaderString])        {            NSLog(@"Failed to compile fragment shader");        }                glAttachShader(program, vertShader);        glAttachShader(program, fragShader);    }        return self;}- (id)initWithVertexShaderString:(NSString *)vShaderString           fragmentShaderFilename:(NSString *)fShaderFilename;{    NSString *fragShaderPathname = [[NSBundle mainBundle] pathForResource:fShaderFilename ofType:@"fsh"];    NSString *fragmentShaderString = [NSString stringWithContentsOfFile:fragShaderPathname encoding:NSUTF8StringEncoding error:nil];        if ((self = [self initWithVertexShaderString:vShaderString fragmentShaderString:fragmentShaderString]))     {    }        return self;}- (id)initWithVertexShaderFilename:(NSString *)vShaderFilename             fragmentShaderFilename:(NSString *)fShaderFilename;{    NSString *vertShaderPathname = [[NSBundle mainBundle] pathForResource:vShaderFilename ofType:@"vsh"];    NSString *vertexShaderString = [NSString stringWithContentsOfFile:vertShaderPathname encoding:NSUTF8StringEncoding error:nil];    NSString *fragShaderPathname = [[NSBundle mainBundle] pathForResource:fShaderFilename ofType:@"fsh"];    NSString *fragmentShaderString = [NSString stringWithContentsOfFile:fragShaderPathname encoding:NSUTF8StringEncoding error:nil];        if ((self = [self initWithVertexShaderString:vertexShaderString fragmentShaderString:fragmentShaderString]))     {    }        return self;}// END:init// START:compile- (BOOL)compileShader:(GLuint *)shader                  type:(GLenum)type                string:(NSString *)shaderString{//    CFAbsoluteTime startTime = CFAbsoluteTimeGetCurrent();    GLint status;    const GLchar *source;        source =       (GLchar *)[shaderString UTF8String];    if (!source)    {        NSLog(@"Failed to load vertex shader");        return NO;    }        *shader = glCreateShader(type);    glShaderSource(*shader, 1, &source, NULL);    glCompileShader(*shader);        glGetShaderiv(*shader, GL_COMPILE_STATUS, &status);    if (status != GL_TRUE)    {        GLint logLength;        glGetShaderiv(*shader, GL_INFO_LOG_LENGTH, &logLength);        if (logLength > 0)        {            GLchar *log = (GLchar *)malloc(logLength);            glGetShaderInfoLog(*shader, logLength, &logLength, log);            if (shader == &vertShader)            {                self.vertexShaderLog = [NSString stringWithFormat:@"%s", log];            }            else            {                self.fragmentShaderLog = [NSString stringWithFormat:@"%s", log];            }            free(log);        }    }        //    CFAbsoluteTime linkTime = (CFAbsoluteTimeGetCurrent() - startTime);//    NSLog(@"Compiled in %f ms", linkTime * 1000.0);    return status == GL_TRUE;}// END:compile#pragma mark -// START:addattribute- (void)addAttribute:(NSString *)attributeName{    if (![attributes containsObject:attributeName])    {        [attributes addObject:attributeName];        glBindAttribLocation(program,                              (GLuint)[attributes indexOfObject:attributeName],                             [attributeName UTF8String]);    }}// END:addattribute// START:indexmethods- (GLuint)attributeIndex:(NSString *)attributeName{    return (GLuint)[attributes indexOfObject:attributeName];}- (GLuint)uniformIndex:(NSString *)uniformName{    return glGetUniformLocation(program, [uniformName UTF8String]);}// END:indexmethods#pragma mark -// START:link- (BOOL)link{//    CFAbsoluteTime startTime = CFAbsoluteTimeGetCurrent();    GLint status;        glLinkProgram(program);        glGetProgramiv(program, GL_LINK_STATUS, &status);    if (status == GL_FALSE)        return NO;        if (vertShader)    {        glDeleteShader(vertShader);        vertShader = 0;    }    if (fragShader)    {        glDeleteShader(fragShader);        fragShader = 0;    }        self.initialized = YES;//    CFAbsoluteTime linkTime = (CFAbsoluteTimeGetCurrent() - startTime);//    NSLog(@"Linked in %f ms", linkTime * 1000.0);    return YES;}// END:link// START:use- (void)use{    glUseProgram(program);}// END:use#pragma mark -- (void)validate;{    GLint logLength;        glValidateProgram(program);    glGetProgramiv(program, GL_INFO_LOG_LENGTH, &logLength);    if (logLength > 0)    {        GLchar *log = (GLchar *)malloc(logLength);        glGetProgramInfoLog(program, logLength, &logLength, log);        self.programLog = [NSString stringWithFormat:@"%s", log];        free(log);    }    }#pragma mark -// START:dealloc- (void)dealloc{    if (vertShader)        glDeleteShader(vertShader);            if (fragShader)        glDeleteShader(fragShader);        if (program)        glDeleteProgram(program);       }// END:dealloc@end

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91免费欧美精品| 亚洲精品成人免费| 成人性生交大片免费看视频直播| 国产亚洲美女精品久久久| 国产丝袜高跟一区| 国产91精品青草社区| 91美女片黄在线观| 亚洲福利精品在线| 日韩视频永久免费观看| 亚洲激情自拍图| 中日韩美女免费视频网址在线观看| 午夜精品久久久久久久白皮肤| 91精品国产91久久久久久| 欧美大尺度激情区在线播放| 久久久久久久久久久亚洲| 国产日韩精品在线| 精品毛片网大全| 国产精品igao视频| 欧美一区二区三区……| 久久琪琪电影院| 欧美极品少妇xxxxⅹ裸体艺术| 国产999精品| 97视频在线观看亚洲| 欧美性xxxx极品高清hd直播| 欧美一区二区大胆人体摄影专业网站| 欧美成人精品一区二区三区| 日韩大胆人体377p| 91夜夜未满十八勿入爽爽影院| 亚洲成年人在线播放| 欧美裸体视频网站| 久久综合九色九九| 欧美激情亚洲一区| 黄色成人在线播放| 日本在线观看天堂男亚洲| 亚洲第一男人天堂| 欧美精品电影免费在线观看| 中文字幕欧美精品在线| 精品高清一区二区三区| 国产在线a不卡| 日韩av手机在线看| 日韩av网站大全| 亚洲国产精品久久久久久| 国产91免费观看| www.日韩.com| 91精品中文在线| 三级精品视频久久久久| 国产成人中文字幕| xvideos亚洲| 清纯唯美亚洲激情| 国产精品丝袜久久久久久高清| 国模精品一区二区三区色天香| 日韩在线观看视频免费| 国产精品一区二区三区久久久| 中文字幕久久久| 欧美高清理论片| 色偷偷9999www| 久久成人在线视频| 国产欧美精品一区二区| 亚洲天堂第二页| 成人伊人精品色xxxx视频| 日韩在线精品一区| 欧美激情一级精品国产| 亚洲国产精品高清久久久| 日韩av有码在线| 久热精品视频在线观看一区| 最好看的2019的中文字幕视频| 国产69精品久久久久9999| 久久99国产精品久久久久久久久| 久久久久久久久久久久久久久久久久av| 成人激情综合网| 亚洲精品久久久久| 91精品在线观看视频| 日本精品久久久久影院| 91久久精品国产| 中文字幕亚洲欧美在线| 亚洲一级免费视频| 日韩国产中文字幕| 91精品久久久久久久久青青| 国产免费一区视频观看免费| 国产精品视频26uuu| 国产精品国内视频| 亚洲成人1234| 久久久这里只有精品视频| 亚洲最新av网址| 色综合伊人色综合网站| 亚洲天堂2020| 欧美精品www在线观看| 性色av一区二区咪爱| 亚洲欧洲日韩国产| 亚洲日韩中文字幕在线播放| 日韩av网站在线| 亚洲一区二区日本| 欧美国产欧美亚洲国产日韩mv天天看完整| 久久免费福利视频| 亚洲男人天堂九九视频| 欧美另类极品videosbestfree| 国产偷国产偷亚洲清高网站| 日本91av在线播放| 国产激情视频一区| 欧美壮男野外gaytube| 欧美性猛交xxxx| 欧美激情综合色| 久久久久www| 色综合久久精品亚洲国产| 96国产粉嫩美女| 国产亚洲精品一区二555| 中日韩美女免费视频网站在线观看| 97超级碰在线看视频免费在线看| 亚洲国产精品va在线看黑人| 日韩欧美a级成人黄色| 久久久久久久久久久人体| 成人免费自拍视频| 亚洲xxxx做受欧美| 91国内在线视频| 欧美中在线观看| 91在线网站视频| 77777亚洲午夜久久多人| 亚洲iv一区二区三区| 精品爽片免费看久久| 欧美日韩亚洲一区二区三区| 96精品视频在线| 911国产网站尤物在线观看| 国产精品第三页| 国产精品一区二区av影院萌芽| 97色在线播放视频| 亚洲在线观看视频网站| 国产精品视频不卡| 大量国产精品视频| 日韩乱码在线视频| 国内精品视频在线| 91精品国产综合久久香蕉最新版| 国产精品久久久久久亚洲调教| 国产精品狼人色视频一区| 综合av色偷偷网| 北条麻妃久久精品| 亚洲一区二区三区在线视频| 精品亚洲男同gayvideo网站| 久热精品在线视频| 国产精品扒开腿做爽爽爽的视频| 成人国产精品一区二区| 亚洲韩国日本中文字幕| 欧洲日韩成人av| 成人中文字幕在线观看| 色综合亚洲精品激情狠狠| 久久久精品一区二区三区| 国产精品国产三级国产aⅴ浪潮| 国产成人亚洲精品| 亚洲天堂第一页| 91精品久久久久久久久久久| 亚洲视频精品在线| 久久韩剧网电视剧| 欧美大片在线免费观看| 日本一区二三区好的精华液| 欧美人成在线视频| 97国产精品久久| 欧美成人午夜视频| 日本久久久久久| 精品福利樱桃av导航| 国模极品一区二区三区| 亚洲精品之草原avav久久| 亚洲人在线观看| 高跟丝袜一区二区三区| 久久久91精品国产一区不卡| 55夜色66夜色国产精品视频|