zoukankan      html  css  js  c++  java
  • 【每日一记】unity3d 图片置灰shader

    项目须要。參考了一下网上的资料,写了一个shader,给button置灰。

    shader详细实现例如以下:

    2016.07.25补充,支持mask剪裁

    Shader "Transparent Colored Gray"
    {
    Properties
    {
    _MainTex ("Base (RGB), Alpha (A)", 2D) = "white" {}
    _Color ("Tint", Color) = (1,1,1,1)

    _StencilComp ("Stencil Comparison", Float) = 8
    _Stencil ("Stencil ID", Float) = 0
    _StencilOp ("Stencil Operation", Float) = 0
    _StencilWriteMask ("Stencil Write Mask", Float) = 255
    _StencilReadMask ("Stencil Read Mask", Float) = 255


    _ColorMask ("Color Mask", Float) = 15


    [Toggle(UNITY_UI_ALPHACLIP)] _UseUIAlphaClip ("Use Alpha Clip", Float) = 0
    }


    SubShader
    {
    Tags

    "Queue"="Transparent" 
    "IgnoreProjector"="True" 
    "RenderType"="Transparent" 
    "PreviewType"="Plane"
    "CanUseSpriteAtlas"="True"
    }

    Stencil
    {
    Ref [_Stencil]
    Comp [_StencilComp]
    Pass [_StencilOp] 
    ReadMask [_StencilReadMask]
    WriteMask [_StencilWriteMask]
    }


    Cull Off
    Lighting Off
    ZWrite Off
    ZTest [unity_GUIZTestMode]
    Blend SrcAlpha OneMinusSrcAlpha
    ColorMask [_ColorMask]


    Pass
    {
    CGPROGRAM
    #pragma vertex vert
    #pragma fragment frag


    #include "UnityCG.cginc"
    #include "UnityUI.cginc"


    #pragma multi_compile __ UNITY_UI_ALPHACLIP

    struct appdata_t
    {
    float4 vertex   : POSITION;
    float4 color    : COLOR;
    float2 texcoord : TEXCOORD0;
    };


    struct v2f
    {
    float4 vertex   : SV_POSITION;
    fixed4 color    : COLOR;
    half2 texcoord  : TEXCOORD0;
    float4 worldPosition : TEXCOORD1;
    };

    fixed4 _Color;
    fixed4 _TextureSampleAdd;
    float4 _ClipRect;


    v2f vert(appdata_t IN)
    {
    v2f OUT;
    OUT.worldPosition = IN.vertex;
    OUT.vertex = mul(UNITY_MATRIX_MVP, OUT.worldPosition);


    OUT.texcoord = IN.texcoord;

    #ifdef UNITY_HALF_TEXEL_OFFSET
    OUT.vertex.xy += (_ScreenParams.zw-1.0)*float2(-1,1);
    #endif

    OUT.color = IN.color * _Color;
    return OUT;
    }


    sampler2D _MainTex;


    fixed4 frag(v2f IN) : SV_Target
    {
    // Sample the texture
    half4 color = tex2D(_MainTex, IN.texcoord) * IN.color;
    float c = 0.299*color.r + 0.587*color.g + 0.184*color.b;
    color.r = color.g = color.b = c;
    color.a *= UnityGet2DClipping(IN.worldPosition.xy, _ClipRect);
    #ifdef UNITY_UI_ALPHACLIP
    clip (color.a - 0.001);
    #endif


    return color;
    }
    ENDCG
    }
    }
    }

    先建一个名为colorGrayMat的材质,把shader文件附加到材质上。


    管理material材质代码:

    public class MaterialManager
    {
        public static void addMaterial(Image img, string materialName)
        {
            Material material = GameAssets.instance.loadMaterial(materialName);
            if (img != null && material != null)
            {
                img.material = material;
            }
        }

        public static void addGrayMaterial(Image img)
        {
            addMaterial(img,"colorGrayMat");
        }
    }

    调用代码:

    MaterialManager.addGrayMaterial(img);


    关于shader资料:

    官网资料: http://docs.unity3d.com/Manual/SL-SurfaceShaders.html(英文)

                       http://unity3d.9tech.cn/news/2013/1220/39315.html(中文)

    猫都能学会的Unity3D Shader入门指南 http://www.onevcat.com/2013/07/shader-tutorial-1/


    
  • 相关阅读:
    C#中AppDomain.CurrentDomain.BaseDirectory及各种路径获取方法
    Windows 2008 server R2安装.NET Framework4时提示“灾难性故障”
    Mysql explain执行计划
    解决Linux c语言运行时候“段错误 (核心已转储)”问题-采用gdb 解决
    udp-->socket通信原理
    udp通信的原理---makefile文件
    c语言知识点
    linux系统man命令用法和安装方法
    <linux系统c语言生成.so文件,生成64位可执行文件,在64位系统中运行32位的可执行文件>
    ubuntu系统无eth0网卡解决办法
  • 原文地址:https://www.cnblogs.com/gavanwanggw/p/6923756.html
Copyright © 2011-2022 走看看