GLSL-测试片段值

GLSL-测试片段值,glsl,Glsl,假设您有一个vec3 colorin从顶点着色器变为frag着色器,是否有方法测试一个值并在需要时覆盖它 例如,将任何蓝色值大于0.5的碎片设置为白色 在我的Shader.frag中,我实现了以下测试: if(colourIn.b>0.5){ //or if(greaterThan(colourIn.b,0.5)) colourIn.b=0.0; } 它编译并渲染场景,但我不知道它是否有效,因为我是色盲(lol)。。。我的理论是否正确,实施是否正确 如果需要,您

假设您有一个
vec3 colorin
顶点着色器
变为
frag着色器
,是否有方法测试一个值并在需要时覆盖它

例如,将任何蓝色值大于0.5的碎片设置为白色

在我的
Shader.frag
中,我实现了以下测试:

    if(colourIn.b>0.5){ //or if(greaterThan(colourIn.b,0.5))
     colourIn.b=0.0;
    }
它编译并渲染场景,但我不知道它是否有效,因为我是色盲(lol)。。。我的理论是否正确,实施是否正确


如果需要,您可以直接编写条件,您的示例应该是正确的,但更明智的做法可能是:

float mixValue = clamp(floor(colourIn.b * 2.0), 0.0, 1.0);
colourIn.b = mix(colourIn.b, 0.0, mixValue);

// the floor will be:
//     0.0 for [0.0 — 0.5);
//     1.0 for [0.5, 1.0)
//     2.0 1.0
//
// so the clamp will make mixValue:
//     0.0 for [0.0, 0.5]
//     1.0 for (0.5, 1.0]
//
// if you were to multiply by 1.99 then you could
// get rid of the clamp but if the input is a 
// GLubyte then that'd move 128 into the low group
// instead of the high one

这避免了有条件的,因此也避免了任何相关的管道暂停或并行化故障。

我已经回答了,我确信您的代码是正确的,但是如果您能提供一个屏幕截图,那么您就可以非常自信了。我不确定你是否被允许在你的帖子中添加218分,但是如果你可以把它放在网上的任何地方,那么其他人可以编辑你的问题,将其包括在内。谢谢你的帖子。很好的解释!它当然应该做到这一点。不幸的是,当我在
.frag
中使用上述代码时,它无法编译。我现在正在玩它,我可能在做一些非常愚蠢的事情。(这是漫长的一天)。不过这很有道理,而且肯定比我的测试更有效。@Reanimation这更可能是我犯了错误——代码是临时编写的,没有经过测试。你手头有实际的错误吗?你添加的图像有一个立方体,左侧有很多蓝色,如果有帮助的话,右侧几乎没有蓝色。好的,谢谢,我正在测试并希望更改左侧立方体上的任何蓝色。我刚回到我的程序,测试了你的代码,它产生了错误:
错误:0:16错误(164)1-需要分配“colorin”(无法修改输入)
所以我猜你的代码是正确的(看起来很有意义),但由于某些原因无法调整值…@Reanimation抱歉,是的,我直接从您的工作代码复制了赋值,假设变量是读/写的。根据需要进行更正。