当前课程知识点:移动图形概论 >  第四章 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 相关基础知识

--GPU 相关基础知识

-1.3 OpenGL ES 技术发展历史

--OpenGL ES 技术发展历史

-1.4 PowerVR SDK 安装和使用

--PowerVR SDK 安装和使用

-第一章测试

第二章 图形编程入门

-2.1 OpenGL ES 基本概念

--OpenGL ES 基本概念

-2.2 编写第一个图形程序

--编写第一个图形程序

-2.3 主要 API 介绍

--主要 API 介绍

-第二章测试

第三章 OpenGL ES 变换

-3.1 矢量和矩阵知识基础

--矢量和矩阵知识基础

-3.2 旋转与位移变换

--旋转与位移变换

-3.3 OpenGL ES 变换基础

--OpenGL ES 变换基础

-第三章测试

第四章 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 的实现

-第七章测试

第八章 PowerVR 工具简介

-8.1 Vulkan 介绍

--Vulkan 介绍

-8.2 SDK 中的实用工具介绍

--SDK 中的实用工具介绍

-综合测试

着色器编程语言语法笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。