GLSL - 重载函数 - 比较Vec值

时间:2013-11-07 20:14:41

标签: glsl

我正在尝试测试颜色值,如果它们大于0.5,则更改它们。

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

    if(colourIn.b > 0.5){
       colourIn.b=0.0;
    }

我在这里阅读了一些帖子,发现this帖子解释了关系运算符只能处理标量整数和标量浮点表达式。

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

    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

为此我得到了bigThan函数使用错误? (我在类似的情况下找不到一个例子)并且colourIn值不能改变?

我可能错了......请帮我解决这个问题。

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

1 个答案:

答案 0 :(得分:2)

是的,关系运算符确实只适用于标量......地球上的colourIn声明为什么(bvec)?考虑到布尔颜色没有多大意义,通常colourIn.b将是vecNivecN类型的标量组件。请包含您要编译的着色器的实际主体。

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

例如,考虑以下伪代码,

vec3  v1 = vec3 (1,2,3);
vec3  v2 = vec3 (3,2,1);

bvec3 gt = greaterThan (v1, v2);

然后布尔向量gt将具有以下形式:

gt.x = false;
gt.y = false;
gt.z = true;

但是,您遇到的最大问题是您正在尝试修改输入值。您无法执行此操作,片段着色器输入在光栅化期间从顶点变换(顶点着色器,几何着色器,曲面细分着色器)输出进行插值,并且是只读的。顶点着色器输入来自顶点缓冲区,也是只读的。着色器能够做的唯一事情是计算管道中下一阶段的输出。

在片段着色器中,下一个阶段将是最终像素输出的混合。在顶点着色器中,它将是曲面细分(GL4 +)和基本组件(几何着色器)和光栅化(片段着色器)。