罪恶后市加工效应

时间:2015-12-26 04:49:33

标签: unity3d shader cg

我正在尝试制作一个着色器,首先我将所有内容都设置为灰度,然后我想根据最小/最大RGB范围提取颜色。我觉得我的if陈述不正确。我试图获得罪恶之城效果,但我所拥有的并不是......

CGPROGRAM
#pragma vertex vert_img
#pragma fragment frag
#pragma fragmentoption ARB_precision_hint_fastest
#include "UnityCG.cginc"

uniform sampler2D _MainTex;
uniform float4 _ColorMin;
uniform float4 _ColorMax;
uniform sampler2D _RampTex;

fixed4 frag (v2f_img i) : COLOR {
    fixed4 original = tex2D(_MainTex, i.uv);
    fixed grayscale = Luminance(original.rgb);
    half2 remap = half2(grayscale, 0.5);
    fixed4 output = tex2D(_RampTex, remap);

    half avg = (original.r + original.g + original.b) / 3;
    half4 nC = half4(avg, avg, avg, original.a);

    if(original.r >= _ColorMin.r && original.r <= _ColorMax.r){
        nC.r = original.r;
    }
    if(original.g >= _ColorMin.g && original.g <= _ColorMax.g){
        nC.g = original.g;
    }
    if(original.b >= _ColorMin.b && original.b <= _ColorMax.b){
        nC.b = original.b;
    }

    output = fixed4(nC.r, nC.g, nC.b, original.a);
    return output;
}
ENDCG

以下是我说的时候我得到的结果

0 - 1红色
0 - 0绿色
0 - 0蓝色

Full Red

以下是原文:

Original

1 个答案:

答案 0 :(得分:0)

这应该有效:

fixed4 original = tex2D(_MainTex, i.uv);
half avg = (original.r + original.g + original.b) / 3;
half4 gray = half4(avg, avg, avg, original.a);      
half4 nC = gray;
if (original.r >= _ColorMin.r && original.r <= _ColorMax.r)
{
    if (original.g >= _ColorMin.g && original.g <= _ColorMax.g)
    {
        if (original.b >= _ColorMin.b && original.b <= _ColorMax.b)
        {
            nC = original;
        }
    }
}
else
{
    nC = gray;
}


output = fixed4(nC.r, nC.g, nC.b, original.a);
return output;

这将为您提供不符合条件的突然轮廓。为了解决这个问题,你可以在else区块中混合颜色。