GLSL三维vec3向量对比:为何>运算符报错而==可正常运行?
GLSL向量比较报错原因说明
这个差异完全由GLSL的语法标准定义决定:
==、!=运算符允许直接作用于向量、矩阵类型:执行逐分量的相等校验,只有所有对应分量完全匹配时才返回单个true布尔值,刚好符合if条件需要单个布尔值的要求,因此可以正常运行。>、<、>=、<=这类关系运算符,GLSL标准没有定义向量、矩阵的直接比较规则:因为向量比较没有通用的默认语义(是所有分量满足条件生效,还是任意分量满足就生效没有统一约定),所以直接禁止这类运算符作用于非基本数值类型,因此写diffuse.rgb > vec3(1)会触发"cannot compare vector or matrices"错误。
如果要实现向量的关系比较,需要搭配GLSL内置函数实现:
- 先用
greaterThan()/lessThan()/greaterThanEqual()/lessThanEqual()做逐分量比较,得到对应长度的布尔向量 - 再用
all()(所有分量为true则返回true)或者any()(任意分量为true则返回true)把布尔向量转为单个布尔值,供给if条件使用
比如要判断diffuse.rgb所有分量都大于1的正确写法为:
if(all(greaterThan(diffuse.rgb, vec3(1)))) { // 业务逻辑 }
内容的提问来源于stack exchange,提问作者Bulieme
相关产品推荐
相关产品推荐

