1

我正在尝试测试颜色值并在它们大于 0.5 时更改它们。

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

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

我在这里阅读了一些文章,发现这篇文章解释了关系运算符仅适用于标量整数和标量浮点表达式。

因此,在找到了一种有效测试 frag 值并使用内置函数的好方法后,将其更改为:

    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 函数被错误地使用了?(我在类似情况下找不到示例)并且无法更改 colourIn 值?

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

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

4

1 回答 1

2

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

此外,greaterThan (...)不适用于标量类型,仅适用于向量。它返回的是一个布尔向量,其中包含针对 v1 和 v2 中的每个组件的测试 v1 > 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+)和基元组装(几何着色器)和光栅化(片段着色器)。

于 2013-11-08T00:04:15.110 回答