09 WebGL 着色器编程语言GLSL ES的程序流程控制(分支ifelse和循环for)

着色器中的分支与循环与JavaScript或C中的几乎无异。


if语句和if-else语句

可以使用if语句或if-else语句进行分支判断,以控制程序流程。下面是使用if-else语句的格式:


下面是一段使用if-else语句的代码示例:

if(distance < 0.5){
    gl_FragColor = vec4(1.0,0.0,0.0,1.0);//红色
}else{
    gl_FragColor = vec4(0.0,1.0,0.0,1.0);//绿色
}
如例中所示,if语句或if-else语句中都必须包含一个布尔值,或者是产生布尔值的表达式。此处不可以使用布尔值类型矢量,比如bvec2。

GLSL ES中没有switch语句,你也应该注意,过多的if或if-else语句会降低着色器的执行速度。


for语句

for 语句的格式如下所示:

比如:

for(int i = 0; i < 3; i++){
    sum += i;
}
注意,循环变量(即例中的i)只能在初始化表达式中定义,条件表达式可以为空,如果这样做,空的条件表达式返回true。此外,for语句还有这样一些限制。
~只允许有一个循环变量,循环变量只能是int或float类型。

~循环表达式必须是以下的形式(假设i是循环变量):

i++,i--,i+=常量表达式或i-=常量表达式。

~条件表达式必须是循环变量与整型常量的比较。

~在循环体内,循环变量不可被赋值。

这些限制的存在是为了是编译器能够对for循环进行内联展开。


continue、break和discard语句

就像在JavaScript和C语言中一样,我们只能在for语句中使用continue和break。通常,我们将它们与if语句搭配使用。

~continue中止包含该语句的最内层循环和执行循环表达式(递增/递减循环变量),然后执行下一次循环。

~break中止包含该语句的最内层循环,并不再继续执行循环。

下面是使用continue的示例:

for(int i = 0; i < 10; i++){
    if(i == 8){
        continue;//跳过循环余下的部分,继续下次循环
    }
    //当i==8时,不会执行这里
}
下面是使用break的示例:

for(int i = 0; i < 10; i++){
    if(i == 8){
        break;//跳出for循环
    }
    //当i>=8时,不会执行这里
}
//当i==8时,执行这里
关于discard,它只能在片元着色器中使用,表示放弃当前片元直接处理下一个片元。具体使用discard的方法将在WebGL中的绘制圆形点中详述。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值