OpenGL 着色器语言基础

数据类型概述:

  • 标量 :也被称为“无向量”其值只有大小,并不具有方向。

  • 向量:有方向的量叫做向量。OpenGLES着色语言中,向量可以看做是用同样类型的标量组成,其基本类型也分为bool、int和float三种。 每个 向量可以由2个、3个、4个相同的标量组成。

     1.其基本类型也分为bool、int和float三种。 每个向量可以由2个、3个、4个相同的标量组成 
     2.向量在着色器中的作用可以很方便的存储以及操作颜色、位置、纹理坐标等不仅包含一个组成部分的量。
      开发中,有时可能需要单独访问向量中的某个分量,基本的语法为 “<向量名>.<分量名>”。
    
这里写图片描述
  • 矩阵:
    1.矩阵在3D开发中的作用:做位移变换
    2.矩阵类型


    image

    3.矩阵初始化
    mat4*4 是什么意思:第一个值表示列,第二个表示行
    初始化矩阵
    <blockquote>mat3 m=mat3(1.0 , 2.0 ,3.0 , 4.0, 5.0, 6.0, 7.0 ,8.0 , 9.0);
    vec3 column1=vec3(1.0 , 2.0 ,3.0 );
    vec3 column2=vec3(4.0, 5.0, 6.0 );
    mat3 m=mat3(column1,column2 ,column3);
    vec2 column1=vec2(1.0 , 2.0 );
    vec2 column3=vec2( 7.0 ,8.0 );
    mat3 m=mat3(column1 ,3.0 ,column2 ,6.0 ,column3 ,9.0);

  • 采样器
    采样器是着色语言中不同于C语言的一种特殊的基本数据类型,其专门用来进行纹理采样的相关操作。一般情况下,一个采样器变量代表一幅或一套纹理贴图


    这里写图片描述
  • 结构体
    OpenGL ES着色语言还提供了类似C语言中的用户自定义结构体,同样也是使用struct关键字进行声明。

<blockquote>struct info{ //声明一个结构体 info
vec3 color; //颜色成员
vec3 position; //位置成员
vec2 texturecoor; //纹理坐标成员
}

  • 数组:声明数组的方式主要有两种:

    <blockquote>1.在声明数组的同时,指定数组的大小。
    vec3 position[10];//声明 一个包含10个vec3的数组
    2.引用数组之前,要再次使用第一种声明方式来生命该数组。
    vec3 position[];//声明 一个大小不定的vec3整型数组
    vec3 position[5];//再次声明该数组 并指定大小

代码中访问数组的下标都是编译时常量,这时编译器会自动创建适当大小的数组,使得数组尺寸足够存储编译器看到的最大索引值对应的元素。

  • 代码如下:

  • <blockquote>vec3 position[];//声明了一个大小不定的vec3数组
    position[3] = vec3(3.0); //position需要一个大小为4的数组
    position[20] = vec3(6.0); //position需要一个大小为21的数组

  • 空类型:空类型使用void表示,仅用来声明不返回任何值得函数。例如在顶点着色器以及片元着色器中必须存在的main函数就是一个返回值为空的函数,代码如下:

<blockquote>void main() {//声明一个空返回值类型的main方法
 }

  • 类型修饰符
    1.attribute 一般用于每个顶点都各不相同的数据,例如:颜色,顶点。。。
    - 只有顶点着色器中会有这哥们(attribute )
    - 是属性限定符
    - 只能用来修饰 浮点数的标量 ,浮点数的向量 , 浮点数的矩阵变量,不能用于修饰其他类型

    2.uinfrom 一致变量限定符

    (一致变量:对同一组顶点组成的单个3D物体中所有的顶点都相同的量)
    - 主要出现在顶点和片元 着色器
    - 可以修饰所有的基本数据类型

    3.verying 用来传递顶点着色器中的数据到片元着色器中

    例如:
    顶点着色器 verying vec2 texture;
    片元着色器 verying vec2 texture;

    4.const 加了这哥们变量值不可变,常量,编译时常量 (编译时常量:在声明的时候要进行初始化,编译器在编译的时候不需要给他分配任何运行时资源。)
    例如:
    const float PI=3.14;

    5.in 和out 用in修饰的变量代表的是输入变量,用out修饰的表示输出变量
    6.inout 用来修饰参数为输入输出参数,同时具有两种功能!

  • GLSL操作符与优先级

这里写图片描述
  • 操作符重载
    例如:向量和矩阵之间的乘法 vec3 v;
    mat3 m;
    vec3 r=v*m;注意:矩阵和向量的维度必须匹配!

  • 控制流

if(){
}else{
}
switch(){
    case : brake; 
    default:break;
 }
  • 循环语句
for(int i=0 ;i<10;i++){}
while(){}
do{
}while()
  • 流控制语句
    brake;
    return;
    continue;
    discard:丢弃当前片元,终止片元着色器执行( 只能在片元着色器中使用,只要运行到该语句,那片元着色器就 会立刻终止)
  • 函数声明
    1.函数声明,变量名需要添加访问修饰符
    2.GLSL支持用户自定义函数,同时它定义了一些内置函数
    3.函数名称可以是任何字符、数字、下划线,但是不能使用数字,连续下划线或者gl_作为函数的开始
    4.返回值可以是任何内置的GLSL类型,或者用户定义的结构体和数组类型。
    5.返回值是数组时,必须现实的指定大小。函数返回类型是void则没有返回值
    6.函数的参数也可以是任何类型的函数,包括数组(这里数组必须设置大小)
    7.在使用一个函数前必须声明他的原型或者直接给出函数体。
    8.GLSL的编译器在使用函数前必须找到函数的声明,否则会产生错误
    9.函数原型只是给出了函数的形式,但是并没有给出具体的实现内容
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354

推荐阅读更多精彩内容