南宁市 桓台县 长海县 七台河市 红原县 四川省 马龙县 治多县 台东县 疏附县 长顺县 正阳县 奈曼旗 台北市 台山市 中超

文章导航软件下载单机游戏安卓资源苹果资源

pc软件新闻网络操作系统办公工具编程服务器软件评测

安卓新闻资讯应用教程刷机教程安卓游戏攻略tv资讯深度阅读综合安卓评测

苹果ios资讯苹果手机越狱备份教程美化教程ios软件教程mac教程

单机游戏角色扮演即时战略动作射击棋牌游戏体育竞技模拟经营其它游戏游戏工具

网游cf活动dnf活动lol周免英雄lol礼包

手游最新动态手游评测手游活动新游预告手游问答

您的位置:单机游戏角色扮演 → 怪物猎人世界新装备介绍 怪物猎人世界新装备新系统一览

朝鲜氢弹试验成功_GPUImage源码解读之GLProgram

标签:腰腿痛 象棋残局破解象棋道

简述

GLProgram是GPUImage中代表openGL ES 中的program,具有glprogram功能。其实是作者对OpenGL ES program的面向对象封装

初始化

- (id)initWithVertexShaderString:(NSString *)vShaderString 
            fragmentShaderString:(NSString *)fShaderString;
- (id)initWithVertexShaderString:(NSString *)vSha调解面对面_2018年最新新闻网derString 
          fragmentShaderFilename:(NSString *)fShaderFilename;
- (id)initWithVertexShaderFilename:(NSString *)vShaderFilename 
            fragmentShaderFilename:(NSString *)fShaderFilename;

program

program = glCreateProgram();

shader

c语言编译流风生水起_2018年最新新闻网程:预编译、编译、汇编、链接

glsl的编译过程类似c语言,主要有glCompileShader、glAttachShader、glLinkProgram三步

创建shader

分别根据两个Shader String来创建两个Shader。但是要注意区别的是,两个Shader的type对应的GLEnum是不一样的。
创建并且compile shader的过程包括几步:

  • 创建OpenGL ES Shader:VertexShader的type是GL_VERTEX_SHADER;而FragmentShader是GL_FRAGMENT_SHADER。
shader = glCreateShader(type);
  • 加载Source String:
source = (GLchar *)[shaderString UTF8String];
glShaderSource(*shader, 1, &source, NULL);
  • 编译Shader:
glCompileShader(*shader);
  • 检查Shader的状态;如果创建失败,则获取log:
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
            {
         厦门_2018年最新新闻网       self.fragmentShaderLog = [NSString stringWithFormat:@"%s", log]湖南大学_2018年最新新闻网;
            }

            free(log);
        }
}
  • 将生成的两个Shader Attach到Program上:
glAttachShader(program, vertShader);
        glAttachShader(program, fragShader);
  • link program并且检查program的状态,如果link失败,则获取log;如果link成功,则表示GLProgram的初始化完毕:
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;
glUseProgram(program);

Attribute的管理

简介

attribute变量是只能在vertex shader中使用的变量。它不能在fragment shader中声明attribute变量,也不能被fragment shader中使用)

在application中,一般用函数glBindAttribLocation()来绑定每个attribute变量的位置,然后用函数glVertexAttribPointer()为每个attribute变量赋值。

在GPUImage中,作者通过一个attributes数组来管理attribute变量。

- (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)[attribute迪拜_2018年最新新闻网s indexOfObject:attributeName];
}

如上述函数所示,每当加入一个attribute时,会先判断在数组中有没有这个变量,如果没有的话,就加到数组中,并且绑定到shader中。变量获取的位置也就是在数组中的位置

uniform的管理

简介

uniform变量 外部程序传递给shader的变量.
函数glUniform**()函数赋值的.shader 中是只读变量,不能被 shader 修改.

在GPUImage中,作者同样通过一个uniforms数组来管理attribute变量。(然而并没有用到????)

在OpenGL ES中,uniform的位置并不是固定的,必须在Program link完成之后才能够获得,因此,获取uniform的位置必须通过以下命令:

- (GLuint)uniformIndex:(NSString *)uniformName
{
    return glGetUniformLocation(program, [uniformName UTF8String]);
}

当前文章:http://ksi-huanhuodan-com.zhaistockbroker.cn/4rd0oxku7/59ab9_159815.html

发布时间:2019-09-16 09:07:33

澳门银河送彩金夏威夷基拉韦厄火山爆发熔岩流出  澳门银河娱乐送彩金网站  澳门银河2949所有网址  澳门银河yh99.com  银河优越会会员申请谷歌再曝恶意插件 比特币可能被Chrome插件劫持  北大校长致歉是种“求真”精神  澳门银河官网真人娱乐  银河国际手机网址2949  银河娱乐在线官方网址  英国推行网上离婚 竟然还有这种操纵网友惊呆  

相关阅读 在Java的反射中,Class.forName和ClassLoader的区别亚马逊再当猪队友:《猎天使魔女3》被曝登陆微软Xbox One平台东北开放棋局:不管朝鲜如何开放 东北经济要大发展韩国加密货币交易所遭黑客袭击:损失超4000万美元“非洲手机之王”传音借壳上市失败,去年出货量达1.2亿浙江东阳市检察院启动环境公益诉讼重庆渝北区委原常委吴德华涉严重违纪违法接受调查无龙舟 不端午 大沥即将进入龙舟模式

文章评论
发表评论

热门文章 腾讯天王卡和地王卡用户可免费领取腾讯视频VIP明天起,深圳将迎新一轮暴雨袭击!这次是凶猛的“龙舟水”!CAC明日10:00开战!快来领观赛指南,东西方全明星阵容揭晓央视网评安徽六安教师上访:让被欠薪的教师有个讲理的地方

最新文章 索尼被曝与AMD合作研发7nm Navi GPU:PS5微微一笑中国科学院大学公布首届本科毕业生去向:仅7人直接就业 MIT利用人工智能技术让“穿墙看人”变成现实官宣!vivo宣布2019年推出5G手机京东斐讯0元购:N1+H1挖矿组合立减100元赠U盘,智能音箱R1抢赚101元伊朗最高领袖要求立即提高伊朗铀浓缩能力

人气排行 苹果新专利公布:iPhone插着数据线也能防水特朗普称金正恩接受访问白宫邀请 暂不解除对朝制裁《战地5》多人实机演示公布:大战场疯狂屠戮冰雹暴雨致西吉3.8万多人、20多万亩农作物受灾媒体称小米确定将于6月25日启动在港招股红米6正式发布,联发科Helio P22+3GB仅售799元武汉发放50万张惠民券 市民凭券乡村景点免费游每天早晚刷牙,却只做好了25%的口腔清洁