GLSL-重载函数-比较Vec值

GLSL-重载函数-比较Vec值,glsl,Glsl,我试着测试颜色值,如果它们大于0.5,就改变它们 我从这个没有编译的测试开始: if(colourIn.b > 0.5){ colourIn.b=0.0; } 我在这里通读了一些文章,发现了一篇解释关系运算符仅适用于标量整数和标量浮点表达式的文章 因此,在找到有效使用内置函数的好方法后,将其更改为: float mixValue = clamp(ceil(colourIn.b * 2.0) - 1.0, 0.0, 1.0); if(grea

我试着测试颜色值,如果它们大于0.5,就改变它们

我从这个没有编译的测试开始:

    if(colourIn.b > 0.5){
       colourIn.b=0.0;
    }
我在这里通读了一些文章,发现了一篇解释关系运算符仅适用于标量整数和标量浮点表达式的文章

因此,在找到有效使用内置函数的好方法后,将其更改为:

    float mixValue = clamp(ceil(colourIn.b * 2.0) - 1.0, 0.0, 1.0);

    if(greaterThan(colourIn.b,0.5)){
       colourIn.b = mix(colourIn.b, 0.0, mixValue);}
不幸的是,它仍然没有编译;它给出了以下错误:

    ERROR: 0:15 error(202) No matching overloaded function found greaterThan
    ERROR: 0:16 error(164) 1-value required assigned "colourIn" (can't modify an input)
    ERROR: 0:15 error(179) Boolean expression expected
为此,我得到greatThan函数被错误地使用了?(我找不到类似情况下的示例)并且颜色值不能更改

我可能错了。。。请帮我弄清楚


基本上,我想将任何蓝色值大于0.5的像素更改为白色(0.0)。

是的,关系运算符确实只适用于标量。。。
colorin
究竟是什么(
bvec
)呢?考虑到布尔颜色没有多大意义,通常
colorin.b
将是来自
vecN
ivecN
类型的标量组件。请包括您尝试编译的着色器的实际主体

此外,
greaterThan(…)
不适用于标量类型,仅适用于向量。它返回的是一个布尔向量,包含v1和v2中每个组件的测试结果v1>v2

例如,考虑下面的伪代码,

vec3v1=vec3(1,2,3);
vec3v2=vec3(3,2,1);
bvec3 gt=大于(v1,v2);
那么布尔向量
gt
将具有以下形式:

gt.x=false;
gt.y=假;
gt.z=真;
但是,最大的问题是您试图修改输入值。无法执行此操作,片段着色器输入是在光栅化期间从顶点变换(顶点着色器、几何体着色器、细分着色器)输出插值的,并且是只读的。顶点着色器输入来自顶点缓冲区,也是只读的。着色器唯一能够做的事情就是为管道中的下一个阶段计算输出


在片段着色器中,下一步是混合以获得最终像素输出。在顶点着色器中,它将是镶嵌(GL4+)和基本体组装(几何体着色器)以及光栅化(片段着色器)。

哦,我明白了!这很有道理。谢谢你花时间解释。那么,在测试frag的输入值后,是否有可能改变frag中的单个像素值?或者只能使用
mix
功能并混合它们吗?感谢您解释布尔
greaterThan
函数;今晚我读到的最好的解释。颜色素也是RGB值的
vec3
。。。如果这个值超过0.5,我想把它变成白色。。。。谢谢。@Reanimation:在最简单的碎片着色器中,输出颜色被写入
gl\u FragColor
。这是一个
vec4
,因此您可以沿以下行编写语句:
gl\u FragColor.b=…
,以将蓝色通道设置为您想要的任何内容。输入不能更改,但您可以(通常也可以)根据输入计算输出。