Shader 入门:GLSL ES(运算符和限定符)
本文最后更新于:2020年6月23日 凌晨
前言
在上一篇文章中我们学习了 GLSL ES 的数据类型,那么本章节学习的是 GLSL ES 中运算符和限定符的内容。
在本系列文章中主要针对 GLSL ES 3.0 进行讲解。
正文
运算符(Operators)
使用括号包裹的内容优先级最高!
优先级 | 操作符 | 描述 |
---|---|---|
1 | ++ -- |
后置自增、自减 |
2 | ++ -- |
前置自增、自减 |
2 | + - ~ ! |
一元运算 |
3 | * % / |
乘、取余、除 |
4 | + - |
加、减 |
5 | << >> |
位运算 |
6 | < > <= >= == != |
关系运算 |
7 | & ^ | |
位与、位异或、位同或 |
8 | && ^^ || |
逻辑与、逻辑异或、逻辑同或 |
9 | ?: |
三目运算 |
10 | = |
赋值 |
10 | += -= *= /= %= <<= >>= &= ^= |= |
算术赋值 |
限定符(Qualifiers)
储存限定符(Storage Qualifiers)
声明变量时可以在类型前面添加一个储存限定符。
限定词 | 含义 |
---|---|
无(默认) | 用于局部作用域。 |
const | 声明为只读的常量。 |
in | 从上一阶段输入到当前着色器。 |
out | 从当前着色器输出到下一阶段。 |
uniform | 在着色器、OpenGL ES 和程序之间共享的变量。 |
const
使用 const
限定符修饰的变量即为常量,常量一但定义就不可再修改。
适用于标量、向量、矩阵、数组和结构体,但不适用于采样器:
1 |
|
in
in
限定符常用于接收从上一阶段输出的变量:
1 |
|
out
out
限定符常用于将当前着色器中的变量输出到下一阶段:
1 |
|
uniform
使用 uniform
限定符来表示一个统一且只读的全局变量,该变量为所有着色器所共用。
注意:声明了却没有使用的 uniform 变量会在编译时被静默移除!
1 |
|
另外 uniform
变量只能在程序中使用 OpenGL ES 的一系列 glUniform
API 进行赋值:
1 |
|
参数限定符(Parameter Qualifiers)
函数的参数也可以使用限定符。
限定词 | 含义 |
---|---|
无(默认) | 和 in 的作用一致。 |
in |
表示复制进函数体内的参数(值传递,不影响原来的值)。 |
out |
表示函数向外复制的参数,必须是之前未被初始化的变量(引用传递,会影响原来的值)。 |
inout |
表示参数将在函数内外保持一致(引用传递,会影响原来的值)。 |
使用示例:
1 |
|
精度限定符(Precision Qualifiers)
浮点数、整数和采样器类型声明可以添加精度限定词来设置精度范围(精度控制可以扩展至向量和矩阵)。
精度限定符不适用于常量、布尔类型和构造函数!
限定词 | 含义 |
---|---|
highp |
满足顶点语言的最低要求(使用 highp 可以获得最大的范围和精度,但是也有可能会降低运行速度)。 |
mediump |
范围和精度介于 highp 和 lowp 之间(通常用于储存高范围的颜色数据和低精度的几何数据)。 |
lowp |
范围和精度比 meduimp 小,但是足以储存所有 8-bit 颜色数据。 |
1 |
|
默认精度限定符(Default Precision Qualifiers)
我们可以用 precision
关键字来声明指定类型的默认精度:
1 |
|
在未主动声明精度的情况下,在顶点着色器中有以下默认精度声明:
1 |
|
而在片段着色器中有以下默认精度声明:
1 |
|
在片段着色器中浮点类型、浮点向量和浮点矩阵都没有默认的精度,所以使用时就必须声明其精度,或者事先声明默认精度!
另外,上面没有提到的类型都没有默认精度!
相关资料
OpenGL ES Registry(OpenGL ES 资料页)
https://www.khronos.org/registry/OpenGL/index_es.php
OpenGL ES 3 Quick Reference Card(OpenGL ES 3 快速参考卡片)
https://www.khronos.org/files/opengles3-quick-reference-card.pdf
GLSL ES Specification 3.00(GLSL ES 规范 3.0)
https://www.khronos.org/registry/OpenGL/specs/es/3.0/GLSL_ES_Specification_3.00.pdf
OpenGL ES 3.0 Online Reference Pages(OpenGL ES 3.0 在线参考页)
https://www.khronos.org/registry/OpenGL-Refpages/es3.0/
传送门
更多分享
公众号
菜鸟小栈
我是陈皮皮,这是我的个人公众号,专注但不仅限于游戏开发、前端和后端技术记录与分享。
每一篇原创都非常用心,你的关注就是我原创的动力!
Input and output.