OpenGL ES基础(二)
(八)类型修饰符
1,类型修饰符作用
作用:数据类型可以通过一些修饰符来改变自己的行为
attribute 一般用于每个顶点都各不同的量,例如:顶点,颜色
1,属于属性限定符
2,修饰的变量,用来接收渲染流水线传递进顶点着色器的当前待处理顶点的各个属性,(用来描述顶点特征)例如:顶点坐标,法向量,颜色,纹理坐标
3,只用于顶点着色器
4,只能用来修饰浮点数的标量,向量,以及矩阵变量!
uniform 一致变量修饰符
(什么是一致变量:一致变量是指 对同一组顶点组成的单个3D物体中所有顶点都相同的量)
1,可以用在顶点和片段着色器中
2,可以修饰所有的基本数据类型
3,在顶点着色器中正确使用的方法
unifrom mat4 modelViewProjectionMAtrix ;
4,怎么将一致变量的值从宿主语言(java语言)传递到着色器
//得到着色器的值
int glHMatrix = GLES20.glGetUniformLocation(mProgram, "vMatrix");
//给着色器的值复赋值
GLES20.gluniformMatrix4fv(glHMatrix ,1,矩阵 ,0)
例子:ndk上获取
//得到着色器的值
GLint timeLoc=glGetUniformLocation(着色器程序,“着色器里面Uniform变量的名字”)
//给着色器里面的变量赋值
Gluniform1f(timeLoc,要付的值)
varying 在顶点着色器和片元着色器中都有,而且变量名一样!(可以有多个)
作用:从顶点着色器传递到片元着色器的量
(只要你想要从顶点着色器传递信息到片元着色器中,就得使用vaying)
const 修饰的变量的值不可变(编译时常量:声明的时候就必须要初始化)
例子:
const float pi=3.14;
in
out
inout in:设置这个变量为着色器的输入变量
out:设置这个变量为着色器的输出变量
inout:用来修饰的参数为输入输出参数,具有输入输出两种功能
(九)语句
1.GLSL操作符与优先级
操作符 描述
() 用于表达式组合,函数调用,构造
[] 数组下标,向量或矩阵的选择器
. 结构体和向量的成员选择
++ – 前缀或后缀的自增自减操作符
- – ! 一元操作符,表示正 负 逻辑非
- / 乘 除操作符
- 二元操作符 表示加 减操作
<> <= >= == != 小于,大于,小于等于, 大于等于,等于,不等于 判断符
&& || ^^ 逻辑与 ,或, 异或
?: 条件判断符
= += –= *= /= 赋值操作符
, 表示序列
- 二元操作符 表示加 减操作
2.操作符重载
GLSL里大部分操作符都是经过重载的,也就是说他们可以用作多种数据类型操作
1.向量和矩阵相乘
例如:vec3 xyz;
mat3 m;
vec3 xyz1 = xyz*m;
注意:要求向量的维度和矩阵的维度必须匹配!
2向量相乘:逐个分量相乘
vec2 a,b,c;
c=ab;//计算 c=( a.xb.x , a.y*b.y );
3矩阵相乘: 得到是通常矩阵相乘的结果;
例如:mat2 m,u,v;
m=uv;
//m=(u00v00+u01v10 u00v01+u01v11
u01v00+u11v10 u10v01+u11*v11);
3.控制流
if(){}else{}
switch(){}
4.循环语句
for(){}
while(){}
do{}while()
5.流控制语句
语句 · 描述
brake 终止循环体的运行,并且继续执行循环体外的内容
continue 种植循环体内当前迭代过程的执行,跳转到代码块开始的部分并继续执行下一次迭代的内容
return 从当前例程返回,可以带有一个函数的返回值(返回值必须与函数声明的返回类型相符合)
discard
丢弃当前片元,终止片元着色器执行(只能在片元着色器中使用,运行到该语句位置上时 片元着色器会立即终止)
6.函数声明
注意:
1.函数声明,变量名需要添加访问修饰符
2.GLSL支持用户自定义函数,同时它定义了一些内置函数
3.函数名称可以是任何字符、数字、下划线,但是不能使用数字,连续下划线或者gl_作为函数的开始
4.返回值可以是任何内置的GLSL类型,或者用户定义的结构体和数组类型。
5.返回值是数组时,必须现实的指定大小。函数返回类型是void则没有返回值
6.函数的参数也可以是任何类型的函数,包括数组(这里数组必须设置大小)
7.在使用一个函数前必须声明他的原型或者直接给出函数体。
8.GLSL的编译器在使用函数前必须找到函数的声明,否则会产生错误
9.函数原型只是给出了函数的形式,但是并没有给出具体的实现内容
例如:
float HornerEvalPolynomial(float coeeff[10] ,float x);
(十)程序的基本结构
1.程序基本组成
- 案例分析
====================案例Start==========================
uinfrom mat4 uMVPMatrix;
attruibte vec3 aPosition;
attruibte vec2 aTexCoor;
varying vec2 vTextureCoord;
void positionShift(){
gl_Position = uMVPMatrix * vec4(aPosition,1.0);
}
void main(){
positionShift();
vTextureCoord = aTexCoor;
}
====================案例End==========================
(十一)内建变量
image.png
image.png
image.png
image.png
2】片元着色器
片元着色器中的内建变量分为输入变量以及输出变量。
一】输入变量
片元着色器中的内建输入变量主要有 gl_FragCoord 和 gl_FrontFacing。这两个内建变量都是只读的,由渲染管线中片元着色器之前阶段生成。
image.png image.png
image.png
image.png
image.png
(十二)内建函数
与其他高级语言类似,为了方便开发,OpenGL ES着色语言也提供了很多的内置函数。
这些函数大都已经被重载,一般具有4种变体,分别用来接收和返回float、vec2、vec3以及vec4类型的值。
为什么使用内置函数:
1.内置函数都是以最优的方式实现的,有部分函数甚至由硬件直接支持,大大提高了执行效率!
注意:大部分内置函数同时适用于顶点作色器与片元着色器,但也有部分内置函数只适合顶点着色器或者片元着色器的
内置函数按照设计目的分为3个类型:
image.png