一日一Shader·模型线框【SS_8】

今天做的效果是连接模型的各顶点,将模型线框化。这个效果的灵感来自于昨天做的星座连线,因为星座间的连线没有规律,所以想用制作好的模型来生成各种线框图。

原理其实也很简单,获取顶点,然后连线……好吧,这条路没走通,换个方案。

根据UV的渲染原理,限制其渲染范围,倒是也能实现边框的感觉,类似这种:

感觉不太理想,三角面没体现出来。要体现出三角面,还得靠Geometry渲染,今天就不深入研究这个了。还是先把UV限制方案完善吧。

这时还要处理3D模型时,背面不显示的问题:

一般用双Pass就行。但是如果用的是SRP管线,它只会识别一个Pass,第二个Pass是无效的,所以要添加一个Tags。

最后的代码:

Shader "MyShader/SS_8" {
    Properties {
        _Color("Color",Color)=(0,0,0,0)
        _EdgeColor("EdgeColor",Color)=(0,0,0,1)
        _Width("Width",Range(0,0.5))=0.2
    }
    SubShader {
        CGINCLUDE
             #include "UnityCG.cginc"
        fixed4 _Color;
        fixed4 _EdgeColor;
        float _Width;  
        struct appdata {
            half4 vertex : POSITION ;
            half2 uv : TEXCOORD0 ;
        };
        struct v2f{
            half4 vertex : SV_POSITION ;
            half2 uv : TEXCOORD0  ;            
            float4 worldPos   : TEXCOORD1;
        };
         v2f vert(appdata v)
        {
            v2f o;
            o.vertex = UnityObjectToClipPos( v.vertex);
            o.uv = v.uv;
            o.worldPos= mul(unity_ObjectToWorld, v.vertex);
            return o;
        }
        fixed4 frag(v2f i) : SV_Target
        {
            fixed4 col;
            float lx = step(_Width, i.uv.x);
            float ly = step(_Width, i.uv.y);
            float hx = step(i.uv.x, 1.0 - _Width);
            float hy = step(i.uv.y, 1.0 - _Width);
            col = lerp(_EdgeColor, _Color, lx*ly*hx*hy);
            return col;
        }
        ENDCG

        Pass {
        Tags{ "LightMode" = "LightweightForward" }
        Blend SrcAlpha OneMinusSrcAlpha  
        Cull Front//要写在CullBack前面
        CGPROGRAM
        #pragma vertex vert
        #pragma fragment frag           
        ENDCG
        }
        
        Pass {            
        Blend SrcAlpha OneMinusSrcAlpha  
        CGPROGRAM
        #pragma vertex vert
        #pragma fragment frag           
        ENDCG

        }          
    } 
}

以及最终的效果:

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值