Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
仅渲染特定纹理颜色-OpenGL_Opengl_Colors - Fatal编程技术网

仅渲染特定纹理颜色-OpenGL

仅渲染特定纹理颜色-OpenGL,opengl,colors,Opengl,Colors,假设我有一个多边形上的纹理: 如何渲染该多边形,并仅允许蓝色穿透红色并使其去饱和?我假设它需要使用专门设计的OpenGL着色器 对于特定的值,是否有这样的好例子,即如果蓝色>200,红色0.2f&&color.b

假设我有一个多边形上的纹理:

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


对于特定的值,是否有这样的好例子,即如果蓝色>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中拍摄图像并对其进行去饱和处理时。黑色/白色和灰色。