读书笔记,ES着色器语言

一、前言

一、前言

本章首要内容:
(1)数据、变量和变量类型。
(2)矢量、矩阵、结构体、数组、采样器(纹理)
(3)运算、程序流、函数
(4)attribute、uniform和varying变量
(5)精度限定词
(六)预管理和指令

前言

       目前重胃疼咳嗽,妈蛋很疼楚,请假了三天,汽车驾驶员培训学校也没去,大概僵硬!今天后续WebGL的求学。

       目前重积滞腹胀,妈蛋好难受,请假了3天,汽车驾驶员培训学校也没去,几乎僵硬!后天坚贞不屈WebGL的求学。

  1. WebGL并不协助GLSL ES 1.00的具有性子。实际上,它支持的是一.00版本的一个子集,其中只囊括WebGL要求的那多少个大旨个性。

  2. GLEL
    ES编程语言是在OpenGL着色器语言(GLSL)的基础上,删除和简化一部分后产生的,下落了硬件消耗,收缩了品质成本。

  3. 基础:
    (1)程序式大小写敏感
    (二)每八个言语都应当以多少个英文分号停止

  4. 奉行顺序
    从main函数开始施行。
    着色器程序有且仅有贰个main()函数,而且该函数无法承受其余参数。
    main函数前的void关键字表示那几个函数不回去任何值。

  5. 注释
    单行注释: // int kp = 4九陆;
    多行注释: /*读书笔记,ES着色器语言。 haha */

  6. 数码值类型(数值和布尔值)
    GLSL援救两种多少值类型
    (壹)数值类型:整数(未有小数点)和浮点数(有小数点)
    (2)布尔值类型:true 和 false
    不援助字符串类型

  7. 变量
    规则:
    (一)只囊括a-z,A-Z,0-玖和下划线_
    (二)变量名的首字母不能够是数字
    (3)不能够是重要字和保留字,不过变量名的一局地能够是它们
    (4)不能以gl_webgl_,或_webgl_始于,那几个前缀已经被OpenGL
    ES保留了

澳门葡京 1

 

 

澳门葡京 2

近来在研商OpenGL
被各个目生的名词虐成狗,所以记录下来一些学学知识点供就学和参考.

二、正文

二、正文

GLSL ES关键字

GLSL是什么?

       A. GLSL辅助两种多少值类型:

       A. GLSL帮忙三种多少值类型:

澳门葡京 3

GLSL(OpenGL Shading Language)
是OpenGL的着色器语言,纯粹的和GPU打交道的微管理器语言.能够知道为C的变种专门针对OpenGL编制程序,不协理指针等等一些C的风味等.
(名词解释:着色器

  1. 整数型(int)与浮点型(float),没小数点的正是整数,反之则是浮点数;
  2. 支撑布尔值类型(bool);
  3. GLSL
    ES不援救字符串类型
  4. 转移形式:调换类型(被转移类型),如:int(float)
  1. 整数型(int)与浮点型(float),没小数点的正是整数,反之则是浮点数;
  2. 援助布尔值类型(bool);
  3. GLSL
    ES不扶助字符串类型
  4. 转换格局:调换类型(被转移类型),如:int(float)

GLSL ES保留字

GPU是多线程并行Computer,GLSL直接面向单指令流多数据流模型的四线程总括。

 

 

  1. GLSL ES是强类型语言
    (壹)GLSL ES供给切切实实指明变量的数据类型: <类型>
    <变量名>
    如: vec4 a_Position
    (贰)定义函数时,必须钦点函数的重回值
    (三)在拓展赋值操作(=)的时候,等号左右两侧的数据类型也必须1律,不然就会出错

  2. 骨干类型

GLSL编写的着色器函数是对每一种数据同时实施的。

       B. []
运算符

       B. []
运算符

澳门葡京 4

每种终端都会由顶点着色器中的算法管理,各类像素也都会由
壹对着色器中的算法管理。

      
[]运算符通过数组下标来访问矢量或矩阵的要素,例:

      
[]运算符通过数组下标来访问矢量或矩阵的要素,例:

GLSL的中央类型

初学者在编排自个儿的着色器时,供给思虑到SIMD的产出天性,并用并行总计的思绪来考虑问题那正是GLSL.

       float m23 = m4[1][2];
m四的第1列中的第四个要素

       float m23 = m4[1][2];
m四的第三列中的第二个因素

为变量内定项目有利于WebGL系统一检查查代码错误,进步程序的运营功用。
如: float klimt // 浮点数变量

大家最广大的用法是在 极限着色器里转换所急需的值,然后传给
片断着色器用.

 

 

  1. 赋值和类型转变
    = 用于赋值,赋值时要确认保证左边变量的体系和左侧的值类型一致

GLSL能做什么

       C.
变量限定词

       C.
变量限定词

日以逼真的材料 – 金属,岩石,木头,油漆等

  1. const 该变量值不能够被改造;

  2. attribute只好出现在终端着色器且不得不被声称为全局变量;

  3. uniform能够在极限或片元着色器中,且务必是全局变量,其为只读而且在同名时能被共享;
  4. varying必须是全局变量,成效正是从顶点着色器向片元着色器传输数据,必须在二种着色器中扬言同名,同连串的varying变量。
  1. const 该变量值不能够被改造;

  2. attribute只可以出现在终端着色器且不得不被声称为全局变量;

  3. uniform能够在极限或片元着色器中,且务必是全局变量,其为只读而且在同名时能被共享;
  4. varying必须是全局变量,成效就是从顶点着色器向片元着色器传输数据,必须在三种着色器中宣示同名,同种类的varying变量。
float f2 = 8.0;

稳步逼真的清远效果 – 区域光和软阴影

 

 

能够接纳内置函数举行类型转变,如:

非现实材质 – 壁画效果,钢笔画,油画和对插画手艺的萧规曹随

       D.
精度限定词

       D.
精度限定词

float f3 = float(8);

针对纹理内部存款和储蓄器的新用处

  1. highp 高精度 (-2^62,2^62)
    2^-16;

  2. mediump 中精度 (-2^14,2^14)
    2^-10;

  3. lowp 低精度 (-2,2)
    2^-8
  1. highp 高精度 (-2^62,2^62)
    2^-16;

  2. mediump 中精度 (-2^14,2^14)
    2^-10;

  3. lowp 低精度 (-2,2)
    2^-8

澳门葡京 5

越来越少的纹路访问

澳门葡京 6

澳门葡京 7

类型调换内置函数

图形管理 – 选用,边缘钝化遮蔽和错综复杂混合

 

 

  1. 运算符

动画片效果 – 关键帧插值,粒子系统

 

 

澳门葡京 8

用户可编制程序的反走样方法

三、结尾

三、结尾

基本类型的运算符

GLSL注意

       上周跟着看《WebGL编制程序指南》,稳固学习进程。

       下一周接着看《WebGL编制程序指南》,稳固学习进度。

说明:

GLSL支持函数重载(就是父类定义方法,子类复写该措施叫重载)

[1]
在开始展览逻辑与(&&)运算时,只有首先个表明式的总括值为true时才会总括第三个表明式。同样,在拓展逻辑或(||)运算时,唯有首先个表明式的值为false时才会估摸第一个表达式。

GLSL不存在数据类型的全自动升级(正是不辅助项目自动进化调换 eg:float 转
double),类型必须严峻保持一致.

[2]
逻辑异或(^^)运算的含义是:只有当左右五个表明式中有且仅有多个为true时,运算结果才是true,不然为false。

GLSL不协理指针,字符串,字符,它基本上是壹种处理数字数据的言语

  1. 矢量和矩阵
    (一)矢量和矩阵类型的变量都含有八个成分,每种成分是贰个数值(整型数、浮点数和布尔值)
    矢量将那些因素排成1列,能够用来表示顶点坐标或颜色值等,而矩阵将成分划分成行和列,能够用来表示转变矩阵。

GLSL不帮衬联合、枚举类型、结构体位字段(>> or <<
左右移)及按位运算符(| or &那种按位与)
(正是干掉麻烦的C操作
让这么些更单纯的管理图片数据选拔)

澳门葡京 9

GLSL的数据类型

6-6.png

GLSL有三种为主数据类型:

(二)赋值和布局
(a) =
等号用于赋值,如:vec4 position = vec4(1.0, 2.0, 3.0, 4.0);
(b)构造函数:专门成立钦命项目的变量的函数,构造函数的称呼和其创建的变量类型名称总是一样的。

float

(叁)矩阵构造函数
(a)想矩阵构造函数中传来矩阵的每二个成分的数值来布局矩阵,注意传入值的顺序必须是列主序的

int

澳门葡京 10

double

(b)向矩阵构造函数中传唱2个或八个矢量,依照列主序使用矢量里的要素值来布局矩阵。

由float、int、double组成的array[]只怕结构体

// 使用两个vec2对象来创建mat2对象
vec2 v2_1 = vec2(1.0, 3.0);
vec2 v2_2 = vec2(2.0, 2.0);
mat2 m2_1 = mat2(v2_1, v2_2);   // 1.0  2.0
                                //  3.0  4.0

// 使用一个vec4对象来创建mat2对象
vec4 v4 = vec4(1.0, 3.0, 2.0, 4.0);
mat2 m2_2 = mat2(v4);     // 1.0  2.0
                          //  3.0  4.0

42// 十进制

(c)向矩阵构造函数中出阿奴矢量和数值,遵照列主序行使矢量里的成分值和一向传入的数值来协会矩阵

042// 八进制

// 使用两个浮点数和一个vec2对象来创建mat2对象
mat2 m2 = mat2(1.0, 3.0, v2_2);      // 1.0  2.0
                                     //  3.0  4.0

0x二A// 十六进制

(d)向矩阵构造函数中盛传单个数值,这样将生成一个对角线元宵素都以该数值,别的因素为0.0的矩阵

只顾:GLSL不援助指针,GLSL把向量和矩阵作为着力数据类型

mat4 m4 = mat4(1.0);    // 1.0  0.0  0.0  0.0
                        // 0.0  1.0  0.0  0.0
                        // 0.0  0.0  1.0  0.0
                        // 0.0  0.0  0.0  1.0

向量:有起第一个人置有方向的线条,也称作
矢量(不要被那个名词吓到,作者记得那一个向量是作者高②的时候数学学的东西).

与矢量构造函数类似,如若传入的数值的数量超越1,有未有高达矩阵成分的数目,就会出错

矢量

mat4 m4 = mat4(1.0, 2.0, 3.0);    // 错误。mat4对象需要16个元素

矢量能够和标量以至矩阵做加减乘除(必须遵从一定规则才能够 不然报错)

(3)访问成分
为了访问矢量或矩阵中的成分,能够行使.[]运算符
(a).运算符

vec2, vec3, vec4 //包蕴2/四分三个浮点数的矢量

澳门葡京 11

ivec二, ivec三, ivec四 //包涵2/百分之七十五个整数的矢量(整形数 前边带i 代表integer)

分量名

bvec2, bvec叁, bvec4 //包罗2/百分之七15个布尔值的矢量

别的方便的x,r或s分量都会回到第叁个轻重,y,g,t分量都会重返第贰个轻重。
如:

上面那一个是壹种GLSL的数据类型, 能够简简单单精通为 vec+数字 就象征
是一个数组里面放多少个因素(应该都是 vec二~vec四里面,没见过
vec5上述和vec2以下,好像那就意味着几维坐标系),暗中认可成分是float浮点类型,后面带i代表integer整形,b代表bool.

vec3 v3 = vec3(1.0, 2.0, 3.0);    // 将v3设为(1.0, 2.0, 3.0)
float f;

f = v3.x;  // 设f为 1.0
f = v3.y;  // 设f为 2.0
f = v3.z;  // 设f为 3.0

f = v3.r;  // 设f为 1.0
f = v3.s;  // 设f为 1.0

vec如何声明使用?

将(同三个聚众的)三个轻重名联合置于点运算符后,就足以从矢量中还要收抽出三个轻重。那个进程乘坐混合(swizzling)
如: v2 = v3.xz
此刻的八个轻重必须属于同一个汇集,举个例子说,你无法使用v三.was

vec三 v; //申明三个维度浮点型向量v

(b)[]运算符
矩阵中的元素从下标0开端坚守列主序读取。
限制:[]中只好出现的索引值必须是常量索引值

v[1] = 3.0;
//给向量v的第3个成分赋值(数组从0开首,下标为一正是第一个因素)

常量索引值概念如下:
(a)整型字面量(0或1)
(b)用 const 修饰的全局变量或部分变量。不包涵函数参数。
(c)循环索引
澳门葡京 ,(d)由前述叁条中的项组成的表明式

//下边二种等价

const int index = 0  // const 关键字表示变量是只读的
vec4 v4a = m4[index]  // 同m4[0]相同

vec三 v = vec3; //数组是延续的储存空间 也就是其余成分暗中认可被这么些0.陆值填充

瞩目,你不能够动用未经const修饰的变量作为索引值,因为它不是3个常量索引值(除非它是循环索引)。

vec3 v = vec3(0.6,0.6,0.6);

int index1 = 0
vec4 v4c = m4[index2]    // 错误:index不是常量索引

留神:
除了用索引格局外,仍是能够用选拔运算符的情势来行使向量.择运算符是对于向量的各种要素约定俗成的称谓,用四个大写拉丁字母来代表。根据向量表示对象的意义不一样,可以应用以下选用运算符:

(4)运算符
对于矢量和矩阵,只可以够运用相比较运算符中的==
!=,不得以接纳><>=<=
1旦想要相比较矢量和矩阵的尺寸,应该是用内置函数,比如lessThan()
只要你想逐分量比较,能够行使内置的函数equal()notEqual()

表示顶点能够用

澳门葡京 12

代表颜色能够用

矢量和矩阵可用的运算符

意味着纹理坐标用

  1. 矢量和浮点数的运算

三种任选一种都一样,成效都以一样的. 也便是说,假诺v是一个向量,那么:

澳门葡京 13

v[0]

(一) 矢量运算

v.x

澳门葡京 14

v.r

(贰) 矩阵和浮点数的运算

v.s

澳门葡京 15

都指的是向量v的第一个因素。

(三)矩阵右乘矢量

例如:

澳门葡京 16

//用构造函数的章程宣示并开头化肆维浮点型

(四) 矩阵左乘矢量

vec4v1 =vec4(1.0,2.0,3.0,4.0);

澳门葡京 17

vec4v2;

(5)矩阵与矩阵相乘

v二.xy=v一.yz;//将v一的第贰个和第五个成分复制到v二的第3个和第四个因素

澳门葡京 18

v二.z=二.0;//给v二的第多个因素赋值

  1. 结构体
    (一)结构体:用户自定义的品种,使用重要字
    struct,将已存在的花色聚合到手拉手,就足以定义为结构体。如:

v二.xy=v壹.yx;//将v1的头多个因素调换,再复制到v二的头多个因素中

矩阵

struct light {    //  定义结构体light
  vec4 color;    // 光的颜色
  vec4 position;    // 广元位置
} 
light 11, 12;    // 声明了light类型的变量11和12

矩阵以下项目都是mat开端

也足以在概念结构体的同时评释该组织体类型类型的变量,如:

mat2 代表2×2的矩阵

struct light {    //  定义结构体和定义变量同时进行
  vec4 color;    // 光的颜色
  vec4 position;    // 广元位置
} 11;    // 该结构体类型的变量11

mat3 代表3×3的矩阵

(2)赋值和布局
结构体有正规的构造函数,其名称与结构体名一致。构造函数的参数的壹1必须与构造体定义中的成员相继1致。

mat4 代表4×4的矩阵

澳门葡京 19

注意:矩阵是按列顺序组织的,先列后行

结构体构造函数的选取方法

正如代码:

(3)访问成员
在结构体变量名后跟点运算符(.),然后再加上成员名,就可以访问变量的分子。如:

mat四m;//申明肆维浮点型方阵m

vec4 color = 11.color;
vec3 position = 11.position;

m[2][3]=二.0;//给方阵的第二列、第陆行成分赋值

  1. 数组
    (1)
    ELSL ES
    只扶助壹维数组,而且数组对象不援救pop()和push()等操作,成立数组时也不供给运用new运算符。
    注明数组,只须要在变量名后加上中括号和数高管度,如:

// 上面三种等价,初叶化矩阵对角

mat2m =mat2

float floatArray[4];    // 声明含有4个浮点数元素的数组
vec4 vec4Array[2];    //  声明含有两个vec4对象的数组

mat2m =mat2(1.0,0.0,0.0,1.0);

数组的长度必须是大于0的整型常量表明式,定义如下:
(a)整型字面量(如0或1)
(b)用const限定字修饰的全局变量或部分变量,不包括函数参数
(c)由前述两条中的项构成的表明式

取样器

举例:

纹理查找须求制定哪个纹理大概纹理单元将制定查找.

int size = 4;
vec4 vec4Array[size];    // 错误。如果第一行为const int size = 4;则不会报错

sampler1D// 访问多个壹维纹理

专注,你不能用const限定字来修饰数组本人。

sampler二D// 访问一个2维纹理

只有整型常量表明式和uniform变量能够被用作数组的索引值。
数组不能够在评释时被二次性地初步化,而必须显式地对各类成分进行开始化。如:

sampler3D// 访问二个三维纹理

vec4Array[0] = vec4(4.0, 3.0, 6.0, 1.0);
vec4Array[1] = vec4(3.0, 2.0, 0.0, 1.0);

samplerCube// 访问三个立方贴图纹理

数组本人只扶助[]运算符,但数组的成分能够出席其自个儿类型援救的人身自由运算。如:

sampler一DShadow// 访问三个带比较的一维深度纹理

// 将floatArray的第二个参数乘以3.14
float f = floatArray[1] * 3.14;
// 将vec4Array的第一个参数乘以vec4(1.0, 2.0, 3.0 ,4.0)
vec4 v4 = vec4Array[0] * vec4(1.0, 2.0, 3.0 ,4.0);

sampler二DShadow// 访问二个带相比较的2维深度纹理

  1. 取样器(纹理)
    总得透过取样器(sampler)类型变量访问纹理。
    有三种为主类型的取样器类型:sampler2DsamplerCube
    取样器变量只可以是uniform变量,或许须要拜访纹理的函数,如texture2D()函数的参数,如:

uniformsampler2Dgrass;

vcc2 coord =vec2;

uniform sampler2D u_Sampler;

vec4color =texture2D(grass, coord);

唯有纹理单元编号能够给取样器变量,而且必须利用gl.uniformli()来开始展览赋值。

万1八个着色器在先后里结合多个文科理科, 能够利用取样器数组.

除了===!=,取样器变量不得以看做操作数加入运算。

constinttex_nums =4;

取样器变量受到着色器帮助的纹路单元的最大数量限制。

uniformsampler2Dtextures[tex_nums];

澳门葡京 20

for(inti =0; i < tex_nums; ++i) {

着色器中取样器类型变量的相当小数量

sampler2Dtex = textures[i];

mediump是一个精度限定字

// todo …

  1. 运算符优先级

}

澳门葡京 21

结构体

  1. 程序流程序调节制:分支和循环
    (1)if 和 if-else

那是唯一的用户能用的自定义类型

![](https://upload-images.jianshu.io/upload_images/3779867-870270bebbb99ae1.png)

if语句格式

struct light

如:

{

if (distance < 0.5) {
  gl_fragColor = vec4(1.0, 0.0, 0.0, 1.0);
} else {
  gl_fragColor = vec4(0.0, 1.0, 0.0, 1.0);
}

vec3position;

(2)for语句

vec3color;

澳门葡京 22

};

for语句格式

light ceiling_light;

如:

数组

for (int i = 0; i < 3; i++) {
  sum += i;
}

数组索引是从0初阶的,而且尚未指针概念

注意:循环变量i只可以在开始化表明中定义,条件表达式可以为空,假若如此做,空的准绳表明式重返true

// 创造三个11个元素的数组

for语句的其余限制:
(a)只同意有一个循环变量,循环变量只可以是intfloat类型。
(b)循环表明式必须是以下的情势:i++,i--,i+=常量表达式或i-=常量表明式
(c)条件表达式必须是循环变量与整型常量的比较
(d)在循环体内,循环变量不可被赋值
这么些限制的留存是为了使编译器就可见对for循环举行内联合展览会开

vec4points[10];

(3)continue、break和discard语句
(a)continue终止包涵该语句的最内层循环和实行循环表明式(递增/递减循环变量),然后实行下贰次巡回
(b)break中止包蕴该语句的最内层循环,并不在继续推行循环。

// 创立二个不点名大小的数组

如:

vec4points[];

// continue case
for (int i = 0; i < 10; i++) {
  if (i == 8) {
    continue;    // 跳过循环体余下的部分,继续下次循环
  }
  // 当i==8时,不会执行到这里
}

// break case
for (int i = 0; i < 10; i++) {
  if (i == 8) {
    break;    // 跳出for循环
  }
  // 当i>=8时,不会执行这里
}
// 当i==8时,执行这里

points[2] =vec4;// points未来大小为3

有关discard,它只辛亏片元着色器中利用,表示放任当前片元直接处理下一片元。

points[7] =vec四;// points今后大小为八

  1. 函数
    (1)

void

澳门葡京 23

只可以用于表明函数再次回到值

函数语句格式

类型转变

能够未有return语句,不过回去类型必须是void
也足以将和谐定义的结构体钦定为回到类型,可是结构体的分子中不能够有数组。

总得驾驭地拓展类型调换,不会活动类型升高

示例:

floatf =2.3;

// RGBA颜色值转为亮度值函数
float luma(vec4, color) {
  return 0.2126 * color.r +  0.7162 * color.g +  0.0722 * color.b;
}

// 调用
attribute vec4 a_Color    // 传了(r, g, b, a)的值
void main() {
  ...
  float brightness = luma(a_Color);
  ...
}

boolb =bool;// b is true

留神,如若调用函数时传出的参数类型与生命函数时钦命的参数类型不均等,就会出错。
如:

限定符

float square(float value) {
  return value * value;
}

void main() {
  ...
  float x2 = square(10);   // 错误。应用10.0
  ...
}

GLSL中有五个限定符(variable
qualifiers)可供使用,它们限定了被标识的变量无法被改动的”范围”.

因为函数评释时的参数是float类型,而调用时却传出了int类型的值。

const

(2)标准评释
假如函数定义在其调用之后,那么大家亟须在进展调用从前先表明该函数的标准。
行业内部会先行告诉WebGL系统函数的参数、参数类型、重临值等等
如:

attribute

float luma(vec4, color);   // 规范声明
main() {
  ...
  float brightness = luma(a_Color);  // luma在定义之前就被调用了
  ...
}

float luma(vec4, color) {
  return 0.2126 * color.r +  0.7162 * color.g +  0.0722 * color.b;
}

uniform

(三)参数限定词
GLSL ES中,可感到参数钦定限定自,以调节参数的表现。
作者们能够将函数参数定义成:
(a)传递给函数的
(b)将在在函数中被复制的
(c)既是传递给函数的,也是快要在函数中被赋值的。
里头(b)和(c)都有点类似于C语言中的指针

varying

澳门葡京 24

const: 和C++里大概,定义不可变常量

(4)内置函数

意味着限定的变量在编写翻译时不可被修改.

澳门葡京 25

attribute:是应用程序传给顶点着色器用的

  1. 全局变量和有个别变量
    attribute、varying和uniform变量都无法不注明为全局变量

不允许声明时初始化

(一)存款和储蓄限定字
在GLSL
ES中,大家平常利用attributevaryinguniform范围字来修饰变量,如下图所示。此外,有时也会接纳const限定字,它象征着色器中的有些变量是定点的常量。

attribute限定符标识的是1种全局变量,该变量在终点着色器中是只读(read-only)的,该变量被用作从OpenGL应用程序向终点着色器中传送参数,由此该限定符仅能用于顶点着色器.

澳门葡京 26

attribute变量是只可以在vertex shader中央银行使的变量

(2)const变量
const变量写在项目从前,表明的同时必须对它进行初叶化,声明之后就无法再去更换它们的值了。
如:

它不可能在fragment shader中注解attribute变量,

const int a = 3232

也不能够被fragment shader中选择)

(3)Attributr变量
只可以冒出在极限着色器中,只可以被声称为全局变量,被用来表示逐顶点的音信。
极限着色器中能够容纳的attribute变量的最大数据与设备有关,你可以通过走访内置的大局常量来赢得最大额的值。
可是无论是设备如何,帮忙WebGL的环境都支持至少8个attribute变量。

在application中,一般用函数glBindAttribLocation()来绑定每一种attribute变量的岗位,然后用函数

澳门葡京 27

glVertexAttribPointer()为种种attribute变量赋值。

(4)uniform变量
能够用在极端着色器和片元着色器中,且务必是全局变量
uniform变量只读,能够是除了数组或结构体之外的自由档期的顺序。
若是在极限着色器和片元着色器中声称了同名的uniform变量,那么它就会被二种着色器共享。
uniform变量包括了一样(非逐顶点/逐片元的,各顶点或各片元公用)的多少,JS应该向其传递此类数据。
比方,转变矩阵就不是逐定点的,而是具有终端共用的,所以它在着色器中是uniform变量。

以下是例证:

uniform mat4 u_ViewMatrix

uniform mat4 u_matViewProjection;

(5)varying变量
必须是全局变量
从极限着色器向片元着色器传输数据。
务必在三种着色器中生命同名、同品种的varying变量

attribute vec4 a_position;

varying vec2 v_TexCoord
varying vec4 v_Color

attribute vec2 a_texCoord0;

varying变量只好是以下项目:floatvec2vec3vec4mat2mat3mat4
极限着色器中赋给varying变量的值并不是直接传给了片元着色器的varying变量,那里面发生了光栅化的经过:依照绘制的图纸,对前者(顶点着色器varying变量)举行内插,然后再传递个后者(片元着色器varying变量)
还好因为varying变量须要被内插,所以大家须求限制它的数据类型

varying vec2 v_texCoord;

设施至少辅助柒个varying变量

void main

  1. 精度限定字
    扶持着色器程序进步运维作用,削减内部存款和储蓄器成本。
    可选,不分明精度能够接纳非凡的暗中同意值:

{

gl_Position = u_matViewProjection * a_position;

#ifdef GL_ES
precision mediump float;
#endif

v_texCoord = a_texCoord0;

WebGL中帮忙的3种精度

}

澳门葡京 28

uniform:一般是应用程序用于设定顶点着色器和片断着色器相关初步化值.不容许表明时伊始化.uniform限定符标识的是1种全局变量,该变量对于一个图元(primitive)来说是不行改变的
它能够从OpenGL应用程序中接收传递来的参数

注意:
(壹)在好几WebGL境遇中,片元着色器恐怕不帮忙highp精度
(贰)数值范围和精度实际上也是与系统景况相关,能够动用gl.getShaderPrecisionFormet()来检查

uniform变量 外部程序传递给shader的变量.

如:

函数glUniform**()函数赋值的.

mediump float size;  //  中精度浮点型变量
highp vec4 position;  //  具有高精度浮点型的vec4对象
lowp vec4 color;  //  具有低精度浮点型的vec4对象

shader 中是只读变量,不能够被 shader 修改.

扬言着色器的私下认可精度,那行代码必须在极限着色器或片元着色器的顶部:
precision 精度限定自 类型名称
表示接下去全部不以精度限定自修饰的该项目的量,其精度便是默许精度,如:

uniform变量一般用来代表:调换矩阵,材质,光照参数和颜料等新闻。

precision mediump float;

uniform mat肆 viewProjMatrix; //投影+视图矩阵

澳门葡京 29

uniform mat4 viewMatrix; //视图矩阵

6-27.png

uniform vec三 lightPosition; //光源地方

只有片元着色器中的float类型没有默许精度,大家需求手动内定。

varying:用于传递顶点着色器的值给片断着色器.它提供了从巅峰着色器向部分着色器传递数据的主意,varying限定符能够在终点着色器中定义变量,然后再传递给光栅化器,光栅化器对数码插值后,再将种种片段的值交给片段着色器.

  1. 预管理指令
    用来在真的编译从前对代码实行预管理,#开始

varying变量是vertex和fragment shader之间做多少传递用的。

澳门葡京 30

相似vertex shader修改varying变量的值,

6-28.png

接下来fragment shader使用该varying变量的值。

#ifdef GL_ES
#ifdef GL_FRAGMENT_PRECISION_HIGH
precision highp float;  //  支持高精度,限定浮点型为高精度

#else
precision mediump float;  //  不支持高精度,限定浮点型为中精度
#endif
#endif

为此varying变量在vertex和fragment shader二者之间的声

能够只是用#version number来钦点着色器使用的GLSL ES版本

明必须是同等的。

能够承受的本子包含100(GLSL ES 一.00)和10壹(GLSL ES
1.01)。借使不行使#version命令,私下认可版本为100

application不可能动用此变量。

点名版本代码:

以下是例证:

#version 101

// Vertex shaderuniform

#version 指令必须在着色器顶部,在它在此以前只可以有注释和空域。

mat4 u_matViewProjection;

attribute vec4 a_position;

attribute vec2 a_texCoord0;

varying vec2 v_texCoord; // Varying in vertex shader

void main

{

gl_Position = u_matViewProjection * a_position;

v_texCoord = a_texCoord0;

}

// Fragment shaderprecision

mediump float;

varying vec2 v_texCoord; // Varying in fragment shader

uniform sampler2D s_baseMap;

uniform sampler2D s_lightMap;

void main()

{

vec4 baseColor;

vec4 lightColor;

baseColor = texture2D(s_baseMap, v_texCoord);

lightColor = texture2D(s_lightMap, v_texCoord);

gl_FragColor = baseColor * (lightColor + 0.25);

}

小心:以上这二种范围符很关键

限制性

无法在if-else中宣称变量

用来判别的规范必须是bool类型(if,while,for…)

操作符后四个参数必须类型一样

不支持switch语句

vec4toonify(infloatintensify)

{

vec4color;

color =vec4(0.8,0.8,0.8,0.8)

returncolor;

}

discard

discard关键字能够制止有个别更新帧缓冲区,当流动调查整遇到那一个根本字时,正在管理的部分就会被标志为丢.

假若不通晓什么叫标志为丢 能够参照一下UIView的绘图进度

函数

函数名能够由此参数类型重载,然而和重返值类型无关

富有参数必须完全合营,参数不会自行

函数不可能被递归调用

函数再次回到值不可能是数组

函数参数标志符

in: 进复制到函数中,但不回去的参数

out: 不将参数复制到函数中,但回来参数

inout: 复制到函数中并重返

混合操作

因此在选用器后列出各分量名,就能够选取那些分量

vec4v4;

v4.rgba;// 得到vec4

v4.rgb;// 得到vec3

v4.b;// 得到float

v4.xy;// 得到vec2

v四.xgba;// 错误!分量名不是同1类

v四.wxyz;// 打乱原有分量顺序

v4.xxyy;// 重复分量

末了推荐二个GLSL编辑调试工具OpenGL Shader Builder(Graphics Tools.dmg)

全文完

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website