仅渲染特定的纹理颜色 - OpenGL

时间:2012-01-30 21:35:07

标签: opengl colors

假设我在多边形上有这个纹理:

img

我如何渲染该多边形并仅允许蓝色透过并使红色去饱和?我假设它需要使用专门设计的OpenGL着色器。

对于特定值是否有任何好的例子,即如果蓝色> 200和红色< 20和绿色<然后再渲染那种颜色,使颜色饱和度降低。我会操纵颜色缓冲区吗?

1 个答案:

答案 0 :(得分:1)

是的,你可以设计一个着色器并使用片段着色器来做(在伪着色器中):

frag()
{
    float4 color = tex2D(myTexture);
    return float4(0,0,color.b,1);
}

这只会返回纹理的蓝色光谱。请注意,片段着色器中的颜色值始终介于0和1之间。

回答问题1

它返回纹理中包含任何蓝色的部分。所以在你的红蓝色纹理的情况下。它只会返回蓝色部分而红色部分会变黑。如果你有某种混合纹理,你会得到一个蓝色的纹理。

我意识到你实际上根本不想看到红色部分。你可以用不同的方式做到这一点。在HLSL中,有一个clip函数。但我不知道GLSL的同义词。另一种方法是设置纹理的透明度,如下所示:

frag()
{
    float4 color = tex2D(myTexture);
    return float4(color.rgb, color.b);
}

这将使用纹理的蓝色部分来确定透明度。由于红色没有蓝色,红色将完全不可见。蓝色有1,所以它将完全可见。

回答问题2

如果你有一块摇滚/石头的纹理而你只想看一个范围内的蓝色像素,你应该制作一个if语句。如果你想看到纹理的“蓝色”,这个着色器就可以了。

如果真的是出于调试目的,最好使用第一个着色器,因为它会将alpha值保持为1.因此,不是透明度,而是变黑。

要仅使用显示“blue-ness”范围,您可以将if语句与上述颜色创建结合使用:

frag()
{
    float4 color = tex2D(myTexture);
    float4 result;

    if(color.b > 0.2f && color.b < 0.7f)
    {
        result = float4(0,0,color.b,1); // only return the blue part
        // or
        result = float4(color.rgb,1); // return the original color if blue is ok
    }
    else
    {
        result = float4(0,0,0,0); // fully transparent, won't show a thing
    }

    return result;
}

正如您所看到的,进行这些检查相当容易。 GLSL与C相同,因此您可以将此基本编程技巧用于此类陈述。