假设我在多边形上有这个纹理:
我如何渲染该多边形并仅允许蓝色透过并使红色去饱和?我假设它需要使用专门设计的OpenGL着色器。
对于特定值是否有任何好的例子,即如果蓝色> 200和红色< 20和绿色<然后再渲染那种颜色,使颜色饱和度降低。我会操纵颜色缓冲区吗?
答案 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相同,因此您可以将此基本编程技巧用于此类陈述。