当前课程知识点:移动图形概论 > 第四章 OpenGL ES 着色器 > 4.1 着色器编程语言介绍 > 着色器编程语言语法
各位同学大家好
今天的课程主要介绍着色器语言
主要内容是
介绍opengles着色器语言的基本语法
opengLES着色器编程与c语言类似
它们的语法相似而且不支持面向对象
但它与c语言具有不同的原生类型
并且定义为允许从应用程序向着色器
高效的传送向量和矩阵这样的数据
OpenGLES着色器编程语言
具有严格定义的类型
大多数类型需要通过构造函数
来将现有类型用作新类型变量的基础
在后面的示例中可以看到很多这样的例子
这里列举了着色器编程语言的基本类型
其中标量包括浮点整型和布尔型
向量包括二维三维四维向量
向量本身包含的元素可以是整形数
浮点数和布尔值
没有前缀的矢量类型名就是浮点型的数据
类型名中的i代表整形
b代表布尔类型
矩阵类型仅支持2阶
3阶和4阶的浮点值组成的矩阵
这段示例代码定义了浮点类型
整型和布尔类型的三个变量
并分别对它们设定了初值
后面利用构造函数对数据类型进行了转换
这里需要注意
把整型转为浮点型
并没有精度损失
把布尔值转为整型或者浮点值的时候
真值也就是True将转化为1
而假也就是False将转化为0
将浮点数和整数转为布尔值的时候
零将会转为False
非零值将会转为True
向量和矩阵之间的定义和转换也非常的灵活
不同类型之间可以转换
定义方式也比较多样
接下来我们也看一些例子
定义二维矢量三维矢量和四维矢量的时候
可以把每个元素都表示出来
也可以仅指定一个元素
那么它们就代表所有的元素值都相同
还可以在向量的定义中使用其他的向量
比如v3c完全由v3a定义而来
而v3D在定义的时候
前两个元素选用了v2a
第三个元素使用了0.5
V4b
定义的时候也使用v2a指定了前两个元素
定义矩阵的时候
也可以仅指定一个标量参数
这代表这个矩阵的全部元素都相同
像这里面展示的mat2
另外还可以使用矢量来定于矩阵
这里m3就通过三个列矢量来定义
如果在初始化矩阵的时候
将所有的元素写在一起
需要注意的是
他按照列然后才是行的顺序排列元素
首先排列的四个元素
是矩阵的第一列
这一点与c语言有所不同
着色器程序
还可以使用一种叫做swizzle的方式
访问向量或者矩阵的各个分量
对于一个四维矢量
它的四个元素既可以通过xyzw来访问
也可以通过
rgba
或者是strq来进行访问
这三个四分量组是等效的
使用他们可以提供极大的方便
如果一个四维矢量代表颜色
它的四个分量就可以使用rgba来访问
如果代表位置
就可以使用xyzw来进行访问
对于矩阵
我们可以使用
数组下标来访问它的各个列矢量
也可以通过二维下标来访问他的单个元素
当然
也可以在向量上
使用swizzle来访问其中的分量
在使用swizzle的时候
还可以更加灵活
比如这个例子中v3b就使用了
xxz将同一个分量使用两次
而v3c则使用gbr这种方式
将分量的顺序做了变化
opengles
还可以使用与c语言相同的方式
定义结构体
这里定义了一个包含三维矢量
和一个四位矢量的结构体
这个结构体
可以用作用户的自定义类型
结构体的名称
可以作为构造函数为这个类型的变量赋初值
访问结构体中每个分量的方式也与c语言类似
这里面是两个例子
每个分量的访问
都可以在变量名后面加小数点
然后用分量的名称来表示
着色器程序中
还可以按c语言相同的方式来定义常量
此时必须在声明常量的时候指定初值
定义常量与定义变量非常类似
只是在前面加上const修饰符
这里面定义了两个常量
其中v3a是一个三维矢量
pi是浮点型的常量
OpenGLES着色器编程语言
还可以按照与c语言相同的方式来定义数组
这里
定义了一个包含三个元素的浮点数组
fArray
和包含四个元素的三维矢量数组
vec3Array
必须要注意的是
大多数的着色器实现
不允许使用变量定义数组
也就是数组的大小必须由常数来指定
就像上面的两个例子一样
Opengles
着色器语言的运算符
与c语言的运算符相同
比如加减乘除基本运算
还有递增递减
都可以在编程中使用
其他运算符还包括=、赋值
+=算数赋值
比较
逻辑与逻辑或逻辑异或
这些运算符的定义
与c语言中也都完全一致
opengLES着色器编程语言
还可以使用大量的预定义函数
这些函数的详细说明
可以通过
Kronos工作组的网站来进行查询
这节课
我们将快速浏览一些最常用的函数实例
其中一些将在后面的课程中有更详细的介绍
length函数用来返回向量v的长度
对于标量他将返回这个标量的绝对值
对于矢量
将返回这个矢量中
全部元素的平方和的平方根
标量其实可以当做一维矢量来看待
后续的介绍中
遇到标量都可以这样理解
点乘函数
返回x和y这两个向量的点乘结果
它的参数
可以是两个标量或者两个矢量
叉乘函数
将返回两个向量x和y的向量积
这两个参数必须都是三维矢量
这里的定义是三维矢量叉乘
在迪卡尔坐标下的表达式
Distance函数
用来返回两个点p1和p2之间的距离
它的定义
就是在笛卡尔坐标系下
两个点的欧式距离
Normalize函数
返回向量v的标准化或归一化向量
得到的向量将为单位长度
可以用这个向量
除以这个向量本身的长度来获得
Reflect函数
返回入设向量I
绕法线向量n的反射向量
即图中的i和r与n的夹角相同
并处于同一平面
这里需要注意
法线向量n必须为单位长度
Refract 函数
返回给定折射率ita情况下
入设向量i
绕法线向量n的折射向量
这里的法线向量N也是单位长度
它用于计算片段着色器中
光线通过玻璃等材料的折射情况
Texture2d函数
根据当前的过滤和限制状态
返回给定二d纹理坐标的纹理颜色
这个函数
将在介绍纹理的时候详细解释
TextureCube函数
返回给定3D纹理坐标处
立方体贴图的纹理颜色
这个函数
也会在介绍立方体贴图的时候详细解释
好
今天的课程内容就到这里
谢谢
-1.1 课程基本情况介绍
--课程基本情况介绍
-1.2 GPU 相关基础知识
-1.3 OpenGL ES 技术发展历史
-1.4 PowerVR SDK 安装和使用
-第一章测试
-2.1 OpenGL ES 基本概念
-2.2 编写第一个图形程序
-2.3 主要 API 介绍
-第二章测试
-3.1 矢量和矩阵知识基础
-3.2 旋转与位移变换
--旋转与位移变换
-3.3 OpenGL ES 变换基础
-第三章测试
-4.1 着色器编程语言介绍
-4.2 着色器编程实例
--着色器编程实例
-第四章测试
-5.1 颜色的基本概念
--颜色的基本概念
-5.2 纹理素材的使用
--纹理素材的使用
-5.3 立方体纹理
--立方体纹理
-第五章测试
-6.1 光照的基本概念
--光照的基本概念
-6.2 光源模型
--光源模型
-6.3 使用着色器渲染颜色
-6.4 反射与折射
--反射与折射
-第六章测试
-7.1 基于物理渲染的基本概念
-7.2 基于图像的照明
--基于图像的照明
-7.3 PBR 的实现
--PBR 的实现
-第七章测试
-8.1 Vulkan 介绍
-8.2 SDK 中的实用工具介绍
-综合测试