我正在尝试测试颜色值,如果它们大于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)。
答案 0 :(得分:2)
是的,关系运算符确实只适用于标量......地球上的colourIn
声明为什么(bvec
)?考虑到布尔颜色没有多大意义,通常colourIn.b
将是vecN
或ivecN
类型的标量组件。请包含您要编译的着色器的实际主体。
此外,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 +)和基本组件(几何着色器)和光栅化(片段着色器)。