更改着色器中特定区域的颜色

时间:2017-01-14 17:51:54

标签: unity3d graphics shader

我需要操纵着色器中特定区域的颜色。该区域为六边形,并在运行时由外部源确定。

我在着色器上使用了六边形纹理,我需要单独更改某些单元格的颜色。

我使用Unity3D Wiki的着色器,但我对着色器没有太多经验。

如果有人可以向我提供一个我可以弄清楚我会如何高兴的来源。

以下是我使用的着色器和链接

Shader "Custom/Shield"
{

Properties
{
    _Color("_Color", Color) = (0.0,1.0,0.0,1.0)
    _Inside("_Inside", Range(0.0,2.0) ) = 0.0
    _Rim("_Rim", Range(0.0,1.0) ) = 1.2
    _Texture("_Texture", 2D) = "white" {}
    _Speed("_Speed", Range(0.5,5.0) ) = 0.5
    _Tile("_Tile", Range(1.0,10.0) ) = 5.0
    _Strength("_Strength", Range(0.0,5.0) ) = 1.5
}

SubShader
{
    Tags
    {
        "Queue"="Transparent"
        "IgnoreProjector"="True"
        "RenderType"="Transparent"

    }


Cull Back
ZWrite On
ZTest LEqual


CGPROGRAM
#pragma surface surf BlinnPhongEditor alpha vertex:vert
//#pragma target 3.0


fixed4 _Color;
sampler2D _CameraDepthTexture;
fixed _Inside;
fixed _Rim;
sampler2D _Texture;
fixed _Speed;
fixed _Tile;
fixed _Strength;

struct EditorSurfaceOutput
    {
        half3 Albedo;
        half3 Normal;
        half3 Emission;
        half3 Gloss;
        half Specular;
        half Alpha;
    };

inline half4 LightingBlinnPhongEditor_PrePass (EditorSurfaceOutput s, half4 light)
{
    half3 spec = light.a * s.Gloss;

    half4 c;

    c.rgb = (s.Albedo * light.rgb + light.rgb * spec);

    c.a = s.Alpha + Luminance(spec);

    return c;


}

inline half4 LightingBlinnPhongEditor (EditorSurfaceOutput s, half3 lightDir, half3 viewDir, half atten)
{
    viewDir = normalize(viewDir);
    half3 h = normalize (lightDir + viewDir);

    half diff = max (0, dot (s.Normal, lightDir));

    float nh = max (0, dot (s.Normal, h));
    float3 spec = pow (nh, s.Specular*128.0) * s.Gloss;

    half4 res;
    res.rgb = _LightColor0.rgb * (diff * atten * 2.0);
    res.w = spec * Luminance (_LightColor0.rgb);

    return LightingBlinnPhongEditor_PrePass( s, res );
}

struct Input
{
    float4 screenPos;
    float3 viewDir;
    float2 uv_Texture;
};


void vert (inout appdata_full v, out Input o)
{
    UNITY_INITIALIZE_OUTPUT(Input,o);
}


void surf (Input IN, inout EditorSurfaceOutput o)
{
    o.Albedo = fixed3(0.0,0.0,0.0);
    o.Normal = fixed3(0.0,0.0,1.0);
    o.Emission = 0.0;
    o.Gloss = 0.0;
    o.Specular = 0.0;
    o.Alpha = 1.0;
    float4 ScreenDepthDiff0= LinearEyeDepth (tex2Dproj(_CameraDepthTexture, UNITY_PROJ_COORD(IN.screenPos)).r) - IN.screenPos.z;
    float4 Saturate0=fixed4(0.3,0.3,0.3,1.0);//
    float4 Fresnel0_1_NoInput = fixed4(0,0,1,1);
    float dNorm = 1.0 - dot(normalize(float4(IN.viewDir, 1.0).xyz), normalize(Fresnel0_1_NoInput.xyz) );
    float4 Fresnel0 = float4(dNorm,dNorm,dNorm,dNorm);
    float4 Step0=step(Fresnel0,float4( 1.0, 1.0, 1.0, 1.0 ));
    float4 Clamp0=clamp(Step0,_Inside.xxxx,float4( 1.0, 1.0, 1.0, 1.0 ));
    float4 Pow0=pow(Fresnel0,(_Rim).xxxx);
    float4 Multiply5=_Time * _Speed.xxxx;
    float4 UV_Pan0=float4((IN.uv_Texture.xyxy).x,(IN.uv_Texture.xyxy).y + Multiply5.x,(IN.uv_Texture.xyxy).z,(IN.uv_Texture.xyxy).w);
    float4 Multiply1=UV_Pan0 * _Tile.xxxx;
    float4 Tex2D0=tex2D(_Texture,Multiply1.xy);
    float4 Multiply2=Tex2D0 * _Strength.xxxx;
    float4 Multiply0=Pow0 * Multiply2;
    float4 Multiply3=Clamp0 * Multiply0;
    float4 Multiply4=Saturate0 * Multiply3;
    o.Emission = Multiply3.xyz * _Color.rgb;
    o.Alpha =  Multiply3.w * _Color.a;

}
ENDCG
}
Fallback "Diffuse"
}

http://wiki.unity3d.com/index.php/Shield

1 个答案:

答案 0 :(得分:0)

  

着色器程序实际上可以包含更多参数(如矩阵,向量和浮点数),这些参数在运行时从代码中设置在材质上,但如果它们不属于“属性”块,则它们的值将不会保存。这对于完全由脚本代码驱动的值(使用Material.SetFloat和类似函数)非常有用。

来源:https://docs.unity3d.com/Manual/SL-Properties.html

您似乎必须使用不同颜色的独特材料。然后,您可以使用Material.SetColor()动态调整材质颜色。