仅渲染特定纹理颜色-OpenGL
假设我有一个多边形上的纹理: 如何渲染该多边形,并仅允许蓝色穿透红色并使其去饱和?我假设它需要使用专门设计的OpenGL着色器仅渲染特定纹理颜色-OpenGL,opengl,colors,Opengl,Colors,假设我有一个多边形上的纹理: 如何渲染该多边形,并仅允许蓝色穿透红色并使其去饱和?我假设它需要使用专门设计的OpenGL着色器 对于特定的值,是否有这样的好例子,即如果蓝色>200,红色0.2f&&color.b
对于特定的值,是否有这样的好例子,即如果蓝色>200,红色<20,绿色<20,则渲染该颜色,否则,对颜色进行去饱和度处理。我会操纵颜色缓冲区吗?是的,您可以设计一个着色器并使用片段着色器(在伪着色器中)执行以下操作: 这将只返回纹理的蓝色光谱。请注意,片段着色器中的颜色值始终介于0和1之间 对问题1的答复 它返回纹理中包含任何蓝色的部分。所以在你的红蓝色纹理的情况下。它将只返回蓝色部分,红色部分将变为黑色。如果你有一些混合纹理,你会得到一个蓝色的纹理 我意识到你其实根本不想看到红色的部分。你可以用不同的方法来做。在HLSL中,有一个
clip
函数。但我不知道GLSL的同义词。另一种方法是设置纹理的透明度,如下所示:
frag()
{
float4 color = tex2D(myTexture);
return float4(color.rgb, color.b);
}
这将使用纹理的蓝色部分来确定透明度。因为红色没有蓝色,所以红色是完全看不见的。蓝色有1,所以它是完全可见的
对问题2的答复
如果你想要一个岩石/石头的纹理,你只想看到一个范围内的蓝色像素,你应该做一个If语句。如果您想看到纹理的“蓝色”,此着色器将执行此操作
如果确实是出于调试目的,则最好使用第一个着色器,因为它会将alpha值保持为1。因此,不是透明,而是黑色
要使用仅显示“蓝色度”范围,可以将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;
}
frag()
{
float4 color=tex2D(myTexture);
4结果;
if(color.b>0.2f&&color.b<0.7f)
{
result=float4(0,0,color.b,1);//只返回蓝色部分
//或
result=float4(color.rgb,1);//如果蓝色正常,则返回原始颜色
}
其他的
{
result=float4(0,0,0,0);//完全透明,不会显示任何内容
}
返回结果;
}
如您所见,进行这些检查相当容易。GLSL与C相同,因此您可以使用您的基本编程技能来处理此类语句。是的,您可以设计着色器并使用片段着色器(在伪着色器中): 这将只返回纹理的蓝色光谱。请注意,片段着色器中的颜色值始终介于0和1之间 对问题1的答复 它返回纹理中包含任何蓝色的部分。所以在你的红蓝色纹理的情况下。它将只返回蓝色部分,红色部分将变为黑色。如果你有一些混合纹理,你会得到一个蓝色的纹理 我意识到你其实根本不想看到红色的部分。你可以用不同的方法来做。在HLSL中,有一个
clip
函数。但我不知道GLSL的同义词。另一种方法是设置纹理的透明度,如下所示:
frag()
{
float4 color = tex2D(myTexture);
return float4(color.rgb, color.b);
}
这将使用纹理的蓝色部分来确定透明度。因为红色没有蓝色,所以红色是完全看不见的。蓝色有1,所以它是完全可见的
对问题2的答复
如果你想要一个岩石/石头的纹理,你只想看到一个范围内的蓝色像素,你应该做一个If语句。如果您想看到纹理的“蓝色”,此着色器将执行此操作
如果确实是出于调试目的,则最好使用第一个着色器,因为它会将alpha值保持为1。因此,不是透明,而是黑色
要使用仅显示“蓝色度”范围,可以将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;
}
frag()
{
float4 color=tex2D(myTexture);
4结果;
if(color.b>0.2f&&color.b<0.7f)
{
result=float4(0,0,color.b,1);//只返回蓝色部分
//或
result=float4(color.rgb,1);//如果蓝色正常,则返回原始颜色
}
其他的
{
result=float4(0,0,0,0);//完全透明,不会显示任何内容
}
返回结果;
}
如您所见,进行这些检查相当容易。GLSL与C相同,因此您可以使用您的基本编程技能来编写此类语句。但这是只在屏幕上呈现蓝色,还是只返回蓝色像素?我把自己弄糊涂了吗?所有的红色部分都会变成黑色。我添加了一个使用透明度来隐藏内容的答案。谢谢。这正是我要找的。你有电子邮件地址吗。我能帮你想一想吗?对不起,这么多年来我没有给你我的个人信息。这不是这个论坛的使用方式。但这会只在屏幕上呈现蓝色还是只返回蓝色的像素?我把自己弄糊涂了吗?所有的红色部分都会变成黑色。我添加了一个使用透明度来隐藏内容的答案。谢谢。这正是我要找的。你有电子邮件地址吗。我能帮你想一想吗?对不起,这么多年来我没有给你我的个人信息。这个论坛不是这样使用的。你说的“去饱和”是什么意思?你的意思是“黑色”或“透明”还是什么?@Nicolas也许我用错了词。在Photoshop中拍摄图像并对其进行去饱和处理时。黑色/白色和灰色。你说的“去饱和”是什么意思?你的意思是“黑色”或“透明”还是什么?@Nicolas也许我用错了词。在Photoshop中拍摄图像并对其进行去饱和处理时。黑色/白色和灰色。