Shader 入门:GLSL ES(迭代、选择和跳转)
本文最后更新于:2020年9月29日 凌晨
前言
在上一章节中我们说到了 GLSL ES 的【运算符和限定符】,那么本章节就来到了【迭代、选择和跳转】的内容。
写《Shader 入门:GLSL ES》系列文章主要目的为让没怎么接触过 GLSL ES 的读者快速入门这门语言。
同时我将默认读者有编程基础,不会对语言内容进行完全的讲解以节省篇幅。
*另外本系列文章中主要针对 GLSL ES 3.0 进行讲解
正文
迭代(Iteration)
循环语句(Loop Statement)
在 GLSL ES 中有以下 3 种循环语句:
for
首先执行初始化表达式,当条件表达式为 true 时执行循环体,之后再执行循环表达式,然后再次进行条件判断,循环往复,直到条件表达式为 false 时结束循环。
1 |
|
while
只要条件表达式为 true 就执行循环体,直到条件表达式为 false 时结束循环。
1 |
|
do-while
先执行一次循环体,之后只要条件表达式为 true 就继续执行循环体,直到条件表达式为 false 时结束循环。
1 |
|
💥循环上限必须明确
需要注意的是,在 GLSL ES 循环语句的条件表达式中,循环的最大次数必须是明确的,如下面的栗子:
1 |
|
因为 GLSL ES 在编译时,编译器会对着色器代码中的 for 循环进行内联展开(Inline Expansion)以提高着色器的执行性能。
所以如果循环的次数不能确定的话就没有办法展开了呢~
选择(Selection)
选择语句(Selection Statement)
在 GLSL ES 中有以下三种选择语句:
if
当条件表达式为 true 时执行下方的语句块。
1 |
|
if-else
当条件表达式为 true 时执行第一个语句块,为 false 时则执行 else 后面的语句块。
1 |
|
switch(GLSL ES 3.0 新增)
switch 语句中的初始化表达式必须为整数,如果 case 标签的值与之相等,则执行标签后面的语句。
当没有匹配的 case 标签时,有 default 标签则执行 default 标签后面的语句,没有则跳过。
初始化表达式的类型必须与所有 case 标签的类型相等,可以使用的类型为
int
和uint
,且不会进行隐式类型转换(Implicit Type Conversion)。
1 |
|
⚡注意
过多的 if 或 if-else 语句会减慢着色器的执行速度,在着色器编写时需要注意这一点。
跳转(Jump)
跳转语句(Jump Statement)
在 GLSL ES 中有以下几种跳转语句:
continue
continue 只可用于循环中,执行该语句时会跳过最内层循环,并执行循环表达式(for 循环),然后执行下一次循环。
1 |
|
break
break 可用于循环和 switch 语句中,执行该语句时将立即退出最内层循环,不再继续执行循环。
1 |
|
return
return 可以用在函数(Function)里的任何位置,执行该语句会直接跳出当前函数。如果 return 有表达式,则会返回表达式的值。
1 |
|
discard
discard 只能在片元着色器(Fragment Shader)中使用,执行该语句将会直接跳出片元着色器,丢弃当前片元。
片元被丢弃之后就不会被渲染出来了,就好像是完全透明了一样~
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/
传送门
系列文章
更多分享
公众号
菜鸟小栈
😺我是陈皮皮,一个不断学习的游戏从业者,一个热爱分享的 Cocos Star Writer。
🎨这是我的个人公众号,专注但不仅限于游戏开发和前端技术分享。
💖每一篇原创都非常用心,你的关注就是我原创的动力!
Input and output.