当前课程知识点:移动图形概论 > 第四章 OpenGL ES 着色器 > 4.1 着色器编程语言介绍 > 着色器编程语言特殊语法
各位同学大家好
今天的课程
继续介绍着色器的编程语言的语法
今天的主要内容
包括函数的用法
程序中的分支控制和循环控制
还有
着色器中比较特殊的数据精度控制
首先
介绍一下opengLES的自定义函数
自定义函数的声明和定义
与c语言的方式类似
因此
在使用自定义函数之前
如果没有被定义的话
必须对函数原型进行声明
openGLES
着色器程序与函数之间传递参数的方式
与在c语言中传递参数的方式完全不同
每个参数会有不同的限定符
当限定符为in的时候
表示给定参数是通过值传递的
不会被函数修改
可以将其理解为只读参数
如果未指定限定符的参数
默认就是in限令符
当限定符为inout时
表示给定的参数是通过引用传递的
可以被函数更改
当限定符为out时
表示给定的参数是返回参数
可以把信息传递到函数外
这里
是一个用户自定义函数的示例
它通过光的方向
与顶点法线方向的一致程度
来计算有多少光落在顶点上
它有两个参数
都是输入型的三维矢量
它的返回值是一个浮点数
首先
他用dot函数
计算两个矢量的点乘
然后用max函数
计算点乘结果和零之间的最大值
并把这个值返回
opengLES着色器程序中
语句的语法与c语言也很相似
存在if-else这样的分支判断
也有
for
while
do等循环语句
这个示例是一条分支判断语句
用于根据颜色的红色通道
是否高于0.5
来将颜色的红色分量设置为1
或者为0
它的语法结构
与c语言是完全相同的
这个示例是一条分支判断语句
用于计算四的阶乘
循环变量为I
循环的语法与c语言也完全一样
这两个程序片段
展示了用while循环和do-while循环
进行循环控制的实例
都是通过n作为循环控制变量
对count参数进行计数
其语法与c语言语法也是相同的
在着色器程序中
还支持精度限定符
允许着色器程序
指定对特定变量执行计算时
所需达到的精度
这个限定符可以是 lowp
表示低精度
或者mediump表示中等精度
或者是highp表示高精度
精度较低的变量
将使用较少的空间来存储
因此
硬件通常能更高效的处理
但是精度较低的变量
可能会降低计算的准确性
因此
在指定变量的精度时要格外注意
因为用户往往
既想要高性能又想要高准确性
但这二者之间
是有一定的矛盾需要进行权衡
使用精度限定符
不光可以指定某个单独变量的精度
还可以指定特定类型的默认精度
在设置默认精度的时候
要使用precision关键字
用来指定特定变量类型的精度
比如这里
指定了一个2D采样器的精度为低精度
指定了整形数为中等精度
同时指定了浮点数为高精度
后续再使用这些类型的时候
就将使用这里设定的默认精度
接下来
几个使用精度限定符的变量定义示例
今天的课就到这里
谢谢大家
-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 中的实用工具介绍
-综合测试