您的位置:首页 > 移动开发 > Unity3D

把一个cube用边框形式表现出来(Unity shader)

2014-05-29 17:07 253 查看
这不是我原创的,是我修改别人的, 原版只有一个pass,且 Cull Off,但这样

不知为什么有的边框会被遮挡(我感觉应该不会遮挡),最后我用了两个pass,

第一个 Cull Front,第二个 Cull Back,效果就Ok了,创建一个Cube,一个matirial,把

这个shader加上,调调颜色,效果很不错!,但为什么只用一个Pass把Cull 设为 Off不行呢??

Shader "Custom/WireFrame" {
    Properties
    {
    _LineColor ("Line Color", Color) = (1,1,1,1)
    _GridColor ("Grid Color", Color) = (1,1,1,0)
    _LineWidth ("Line Width", float) = 0.2
    }
    SubShader
    {
    Pass
    {
    Tags { "RenderType" = "Transparent" }
    Blend SrcAlpha OneMinusSrcAlpha//这句可以注释掉,能够避免线框太粗出现的模糊效果。
    //AlphaTest Greater 0.5
    Cull Front//这句是后加的,取消遮挡消隐,体现出透明
     
    CGPROGRAM
    #pragma vertex vert
    #pragma fragment frag
     
    uniform float4 _LineColor;
    uniform float4 _GridColor;
    uniform float _LineWidth;
     
    // vertex input: position, uv1, uv2
    struct appdata
    {
    float4 vertex : POSITION;
    float4 texcoord1 : TEXCOORD0;
    float4 color : COLOR;
    };
     
    struct v2f
    {
    float4 pos : POSITION;
    float4 texcoord1 : TEXCOORD0;
    float4 color : COLOR;
    };
     
    v2f vert (appdata v)
    {
    v2f o;
    o.pos = mul( UNITY_MATRIX_MVP, v.vertex);
    o.texcoord1 = v.texcoord1;
    o.color = v.color;
    return o;
    }
     
    fixed4 frag(v2f i) : COLOR
    {
    fixed4 answer;
     
    float lx = step(_LineWidth, i.texcoord1.x);
    float ly = step(_LineWidth, i.texcoord1.y);
    float hx = step(i.texcoord1.x, 1.0 - _LineWidth);
    float hy = step(i.texcoord1.y, 1.0 - _LineWidth);
     
    answer = lerp(_LineColor, _GridColor, lx*ly*hx*hy);
     
    return answer;
    }
    ENDCG
    }
    
    // add another
            Pass
    {
    Tags { "RenderType" = "Transparent" }
    Blend SrcAlpha OneMinusSrcAlpha//这句可以注释掉,能够避免线框太粗出现的模糊效果。
    //AlphaTest Greater 0.5
    Cull Back//only this is different
     
    CGPROGRAM
    #pragma vertex vert
    #pragma fragment frag
     
    uniform float4 _LineColor;
    uniform float4 _GridColor;
    uniform float _LineWidth;
     
    // vertex input: position, uv1, uv2
    struct appdata
    {
    float4 vertex : POSITION;
    float4 texcoord1 : TEXCOORD0;
    float4 color : COLOR;
    };
     
    struct v2f
    {
    float4 pos : POSITION;
    float4 texcoord1 : TEXCOORD0;
    float4 color : COLOR;
    };
     
    v2f vert (appdata v)
    {
    v2f o;
    o.pos = mul( UNITY_MATRIX_MVP, v.vertex);
    o.texcoord1 = v.texcoord1;
    o.color = v.color;
    return o;
    }
     
    fixed4 frag(v2f i) : COLOR
    {
    fixed4 answer;
     
    float lx = step(_LineWidth, i.texcoord1.x);
    float ly = step(_LineWidth, i.texcoord1.y);
    float hx = step(i.texcoord1.x, 1.0 - _LineWidth);
    float hy = step(i.texcoord1.y, 1.0 - _LineWidth);
     
    answer = lerp(_LineColor, _GridColor, lx*ly*hx*hy);
     
    return answer;
    }
    ENDCG
    }
    }
    Fallback "Vertex Colored", 1
    }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐