死侍(DeadPool)

前两天看完《死侍》,作为死侍狂热者的我,自然感觉不过瘾,便决定动动手,搞点儿诡异的东西~

首先呢,这不是图片,而是完全由Pixel Shader绘制而成的;
其次呢,当下手机是不支持Pixel Shader的;
然后呢,完全是想到哪写到哪,没经过任何优化调整(请让我懒死~);
故而呢,Just for fun~

开心就好~

贴在一个UGUI的image上,效果如图:
这里写图片描述

附上异常冗长的shader:

Shader "JustForFun/DeadPool" {
    Properties {
        iChannel0("iChannel0", 2D) = "white" {}  
        iChannelResolution0 ("iChannelResolution0", Vector) = (100,100,0,0)
    }

    CGINCLUDE

    #include "UnityCG.cginc"
    #pragma target 3.0  

    #define vec2 float2
    #define vec3 float3
    #define vec4 float4
    #define mat2 float2x2
    #define iGlobalTime _Time.y
    #define mod fmod
    #define mix lerp
    #define atan atan2
    #define fract frac 
    #define texture2D tex2D
    // 屏幕的尺寸
    #define iResolution _ScreenParams
    // 屏幕中的坐标,以pixel为单位
    #define gl_FragCoord ((_iParam.scrPos.xy/_iParam.scrPos.w)*_ScreenParams.xy)  

    sampler2D iChannel0;
    fixed4 iChannelResolution0;

    struct v2f {      
        float4 pos : SV_POSITION;      
        float2 uv : TEXCOORD0;
        float4 scrPos : TEXCOORD1;
    };    

    v2f vert(appdata_base v) {
        v2f o; 
        o.uv = v.texcoord;  
        o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
        o.scrPos = ComputeScreenPos(o.pos); 

        return o;    
    }

    vec4 main(vec2 uv);

    fixed4 frag(v2f _iParam) : COLOR0 { 
        vec2 fragCoord = gl_FragCoord;
        return main(gl_FragCoord);
    } 

    float Circle(vec2 center, float radius, vec2 coord) {//圆(圆心,半径,)
        vec2 offset = coord - center;

        return sqrt((offset.x * offset.x) + (offset.y * offset.y)) - radius;
    }

    float Ellipse(vec2 center, float a, float b, vec2 coord) {//椭圆(圆心,a,b,)
        float a2 = a * a;
        float b2 = b * b;
        return (b2 * (coord.x - center.x) * (coord.x - center.x) + 
            a2 * (coord.y - center.y) * (coord.y - center.y) - a2 * b2)/(a2 * b2);
    }

    float Line(vec2 p0, vec2 p1, float width, vec2 coord) {//线
        vec2 dir0 = p1 - p0;
        vec2 dir1 = coord - p0;
        float h = clamp(dot(dir0, dir1)/dot(dir0, dir0), 0.0, 1.0);
        return (length(dir1 - dir0 * h) - width * 0.5);
    }

    float B( const float a, const float b ) {//并
        return min(a, b);
    }

    float C( const float a, const float b) {//差
        return max(a, -b);
    }

    float J( const float a, const float b ) {//交
        return max(a, b);
    }

    vec4 render(float d, vec3 color, float stroke) {//stroke是描边宽度
        float anti = fwidth(d) * 1.0;
        vec4 colorLayer = vec4(color, 1.0 - smoothstep(-anti, anti, d));
        if (stroke < 0.000001) {
            return colorLayer;
        }

        vec4 strokeLayer = vec4(vec3(0.05, 0.05, 0.05), 1.0 - smoothstep(-anti, anti, d - stroke));
        return vec4(mix(strokeLayer.rgb, colorLayer.rgb, colorLayer.a), strokeLayer.a);
    }

    vec4 main(vec2 fragCoord) {
        float size = min(iResolution.x, iResolution.y);
        float pixSize = 1.0 / size;
        vec2 uv = fragCoord.xy / iResolution.x;
        float stroke = pixSize * 1.5;
        vec2 center = vec2(0.5, 0.5 * iResolution.y/iResolution.x);
red
        ///face
        float centery=center.y+0.1;
        float centerx=center.x;
        float r1=0.1;
        float a=Circle(vec2(centerx,centery),r1,uv);
        ///leftArm
        float a1=Line(vec2(center.x,center.y-0.02),vec2(center.x,center.y-0.07),0.04,uv);
        a=B(a,a1);
        ///rightArm
        a1=Line(vec2(center.x-0.06,center.y-0.02),vec2(center.x-0.085,center.y-0.02),0.03,uv);
        a=B(a,a1);
        ///body
        float f=Line(vec2(center.x,center.y),vec2(center.x,center.y-0.089),0.125,uv);
        float f1=Line(vec2(center.x-0.1,center.y-0.155),vec2(center.x+0.1,center.y-0.155),0.08,uv);
        f=C(f,f1);
        vec4 layer5=render(f,vec3(0.76,0.13,0.11),stroke);//body
        vec4 layer0=render(a,vec3(0.76,0.13,0.11),stroke);
black
        ///face
        float r2=0.05;
        float b=Circle(vec2(centerx-r1/2,centery),r2,uv);
        ///leftArm
        float b1=Line(vec2(center.x,center.y-0.02),vec2(center.x,center.y-0.045),0.04,uv);
        b=B(b1,b);
        b1=Circle(vec2(center.x,center.y-0.1),0.06,uv);
        b=C(b,b1);
        ///shoe
        b1=Line(vec2(center.x+0.03,center.y-0.13),vec2(center.x-0.08,center.y-0.13),0.03,uv);
        b=B(b,b1);
        b1=Line(vec2(center.x+0.1,center.y-0.102),vec2(center.x-0.1,center.y-0.102),0.04,uv);
        b=C(b,b1);
        b1=Line(vec2(center.x+0.093,center.y-0.2),vec2(center.x+0.093,center.y+0.2),0.1,uv);
        b=C(b,b1);
        b1=Line(vec2(center.x-0.1,center.y-0.1),vec2(center.x-0.12,center.y-0.13),0.1,uv);
        b=C(b,b1);
        b1=Circle(vec2(center.x-0.06,center.y-0.138),0.012,uv);
        b=B(b,b1);
        b1=Line(vec2(center.x-0.2,center.y-0.18),vec2(center.x+0.2,center.y-0.18),0.078,uv);
        b=C(b,b1);
        ///knife
        float m=Line(vec2(center.x-0.028,center.y-0.08),vec2(center.x,center.y-0.11),0.004,uv);
        float m1=Line(vec2(center.x+0.035,center.y-0.05),vec2(center.x+0.03,center.y-0.08),0.002,uv);
        m=B(m,m1);
        m1=Line(vec2(center.x+0.022,center.y-0.06),vec2(center.x+0.04,center.y-0.07),0.002,uv);
        m=B(m,m1);
        m1=Line(vec2(center.x+0.04,center.y-0.05),vec2(center.x+0.05,center.y-0.06),0.006,uv);
        m=B(m,m1);
        m1=Line(vec2(center.x+0.11,center.y+0.06),vec2(center.x+0.12,center.y+0.05),0.006,uv);
        m=B(m,m1);
        m1=Line(vec2(center.x+0.07,center.y+0.02),vec2(center.x+0.09,center.y+0.02),0.002,uv);
        m=B(m,m1);
        m1=Line(vec2(center.x+0.07,center.y+0.02),vec2(center.x+0.09,center.y),0.004,uv);
        m=B(m,m1);
        m1=Line(vec2(center.x+0.09,center.y+0.04),vec2(center.x+0.11,center.y+0.04),0.002,uv);
        m=B(m,m1);
        m1=Line(vec2(center.x+0.08,center.y+0.03),vec2(center.x+0.08,center.y+0.01),0.002,uv);
        m=B(m,m1);
        m1=Line(vec2(center.x+0.1,center.y+0.05),vec2(center.x+0.1,center.y+0.03),0.002,uv);
        m=B(m,m1);
        vec4 layer1=render(b,vec3(0,0,0),stroke);
        vec4 layer12=render(m,vec3(0,0,0),0.001);
white
        ///eye
        float r3=0.01;
        float centerEye=centerx-r1/2-0.03;
        float bottomEye=centery-0.01;
        float c=Circle(vec2(centerEye,bottomEye),r3,uv);
        float c1=Line(vec2(centerEye+0.01,bottomEye-0.005),vec2(centerEye-0.01,bottomEye-0.015),0.015,uv);
        c=J(c,c1);
        ///knife
        float l=Line(vec2(center.x+0.04,center.y-0.06),vec2(center.x-0.2,center.y-0.2),0.015,uv);
        float l1=Line(vec2(center.x,center.y-0.02),vec2(center.x,center.y-0.07),0.05,uv);
        l=C(l,l1);
        l1=Line(vec2(center.x-0.12,center.y+0.2),vec2(center.x-0.22,center.y-0.22),0.05,uv);
        l=C(l,l1);
        l1=Line(vec2(center.x+0.04,center.y-0.052),vec2(center.x-0.2,center.y-0.192),0.015,uv);
        l=C(l,l1);
        vec4 layer11=render(l,vec3(0.73,0.76,0.74),0);
        vec4 layer2=render(c,vec3(1,1,1),stroke);
darkRed
        ///faceShadow
        float r4=0.1;
        float d=Circle(vec2(centerx,centery),r4,uv);
        float d1=Circle(vec2(centerx-0.04,centery),r1,uv);
        d=C(d,d1);
        //leftArmShadow
        d1=Line(vec2(center.x,center.y-0.02),vec2(center.x,center.y-0.07),0.04,uv);
        d=B(d,d1);
        d1=Ellipse(vec2(center.x-0.008,center.y),0.022,0.08,uv);
        float d2=Line(vec2(center.x-0.5,center.y),vec2(center.x+0.5,center.y),0.05,uv);
        d1=C(d1,d2);
        d=C(d,d1);
        //rightArmShadow
        d1=Line(vec2(center.x-0.06,center.y-0.02),vec2(center.x-0.085,center.y-0.02),0.03,uv);
        d2=Line(vec2(center.x-0.06,center.y-0.01),vec2(center.x-0.08,center.y-0.01),0.03,uv);
        d1=C(d1,d2);
        d=B(d,d1);
        //shadow
        float j=Ellipse(vec2(center.x,center.y-0.15),0.2,0.02,uv);
        vec4 layer3=render(d,vec3(0.59,0.07,0.05),0.0);
        vec4 layer9=render(j,vec3(0.57,0.08,0.06),0.0);
yellow
        ///belt
        float e=Circle(vec2(center.x-0.45,center.y-0.04),0.5,uv);
        float e1=Circle(vec2(center.x-0.463,center.y-0.04),0.5,uv);
        e=C(e,e1);
        e1=Line(vec2(centerx+2,centery),vec2(centerx-2,centery-0.85),0.5,uv);
        e=C(e,e1);
        e1=Line(vec2(centerx+0.089,centery-0.195),vec2(centerx-0.089,centery-0.195),0.014,uv);
        e=B(e,e1);
        e1=Line(vec2(centerx+0.089,centery-0.3),vec2(centerx+0.089,centery),0.05,uv);
        e=C(e,e1);
        e1=Line(vec2(centerx-0.089,centery-0.3),vec2(centerx-0.089,centery),0.05,uv);
        e=C(e,e1);
        e1=Line(vec2(center.x,center.y-0.02),vec2(center.x,center.y-0.07),0.05,uv);
        e=C(e,e1);
        e1=Circle(vec2(centerx,centery),0.105,uv);
        e=C(e,e1);
        e1=Line(vec2(center.x-0.1,center.y+0.3),vec2(center.x+0.1,center.y+0.3),0.3,uv);
        e=C(e,e1);
        e1=Line(vec2(center.x-0.1,center.y-0.3),vec2(center.x+0.1,center.y-0.3),0.396,uv);
        e=C(e,e1);
        e1=Circle(vec2(center.x+0.35,center.y-0.04),0.4,uv);
        float e2=Circle(vec2(center.x+0.36,center.y-0.04),0.4,uv);
        e1=C(e1,e2);
        e2=Circle(vec2(centerx,centery),0.105,uv);
        e1=C(e1,e2);
        e2=Line(vec2(center.x-0.1,center.y+0.3),vec2(center.x+0.1,center.y+0.3),0.3,uv);
        e1=C(e1,e2);
        e2=Line(vec2(center.x-0.1,center.y-0.25),vec2(center.x+0.1,center.y-0.25),0.396,uv);
        e1=C(e1,e2);
        e2=Line(vec2(center.x-0.1,center.y-0.04),vec2(center.x+0.1,center.y-0.09),0.008,uv);
        e1=B(e1,e2);
        e2=Line(vec2(center.x+0.1,center.y-0.02),vec2(center.x+0.1,center.y-0.07),0.25,uv);
        e1=C(e1,e2);
        e2=Line(vec2(center.x-0.1,center.y-0.02),vec2(center.x-0.1,center.y-0.07),0.1,uv);
        e1=C(e1,e2);
        e=B(e1,e);
        vec4 layer4=render(e,vec3(0.55,0.44,0.23),stroke);
        ///yellow,plus
        float g=Line(vec2(center.x-0.035,center.y),vec2(center.x-0.035,center.y-0.2),0.005,uv);
        float g1=Line(vec2(center.x+0.035,center.y),vec2(center.x+0.035,center.y-0.2),0.005,uv);
        g=B(g,g1);
        float g2=Line(vec2(center.x-0.1,center.y-0.03),vec2(center.x+0.1,center.y-0.03),0.1,uv);
        g=C(g,g2);
        g2=Line(vec2(center.x-0.1,center.y-0.17),vec2(center.x+0.1,center.y-0.17),0.12,uv);
        g=C(g,g2);
        vec4 layer6=render(g,vec3(0.55,0.44,0.23),stroke);
green
        ///grenade
        float h=Circle(vec2(center.x-0.05,center.y-0.035),0.017,uv);
        float h1=Line(vec2(center.x-0.05,center.y-0.01),vec2(center.x-0.05,center.y-0.02),0.01,uv);
        h=B(h,h1);
        h1=Line(vec2(center.x-0.06,center.y-0.01),vec2(center.x-0.05,center.y-0.01),0.008,uv);
        h=B(h,h1);
        h1=Line(vec2(center.x-0.06,center.y-0.01),vec2(center.x-0.07,center.y-0.02),0.005,uv);
        h=B(h,h1);
        vec4 layer7=render(h,vec3(0.16,0.23,0.17),0.004);
darkGreen
        float i=Circle(vec2(center.x-0.05,center.y-0.035),0.017,uv);//grenade
        float i1=Circle(vec2(center.x-0.06,center.y-0.025),0.017,uv);
        i=C(i,i1);
        vec4 layer8=render(i,vec3(0.08,0.15,0.09),0);    
darkKnife
        float k=Line(vec2(center.x+0.04,center.y-0.06),vec2(center.x-0.2,center.y-0.2),0.015,uv);
        float k1=Line(vec2(center.x,center.y-0.02),vec2(center.x,center.y-0.07),0.05,uv);
        k=C(k,k1);
        k1=Line(vec2(center.x-0.12,center.y+0.2),vec2(center.x-0.22,center.y-0.22),0.05,uv);
        k=C(k,k1);
        k1=Line(vec2(center.x+0.06,center.y),vec2(center.x+0.11,center.y+0.05),0.015,uv);
        k=B(k,k1);
        k1=Line(vec2(center.x+0.055,center.y-0.05),vec2(center.x+0.055,center.y+0.05),0.022,uv);
        k=C(k,k1);
        vec4 layer10=render(k,vec3(0.44,0.58,0.51),0.004);  
darkGun
        float n=Line(vec2(center.x-0.2,center.y),vec2(center.x-0.08,center.y),0.05,uv);
        float n1=Line(vec2(center.x-0.08,center.y),vec2(center.x-0.08,center.y-0.05),0.03,uv);
        n=B(n,n1);
        n1=Line(vec2(center.x-0.2,center.y-0.08),vec2(center.x+0.2,center.y-0.08),0.05,uv);
        n=C(n,n1);
        n1=Line(vec2(center.x-0.3,center.y+0.04),vec2(center.x,center.y+0.04),0.05,uv);
        float n2=Line(vec2(center.x-0.08,center.y+0.2),vec2(center.x-0.08,center.y-0.2),0.02,uv);
        n1=C(n1,n2);
        n=C(n,n1);
        n1=Line(vec2(center.x-0.3,center.y-0.04),vec2(center.x-0.16,center.y-0.04),0.05,uv);
        n=C(n,n1);
        n1=Line(vec2(center.x-0.135,center.y-0.01),vec2(center.x-0.155,center.y-0.06),0.02,uv);
        n=B(n,n1);
        n1=Line(vec2(center.x,center.y-0.18),vec2(center.x-0.47,center.y+0.14),0.02,uv);
        n=C(n,n1);
        n1=Line(vec2(center.x-0.18,center.y-0.05),vec2(center.x-0.18,center.y-0.01),0.015,uv);
        n=B(n,n1);
        n1=Line(vec2(center.x-0.173,center.y-0.06),vec2(center.x-0.47,center.y-0.06),0.02,uv);
        n=C(n,n1);
        n1=Line(vec2(center.x-0.215,center.y+0.1),vec2(center.x-0.215,center.y-0.1),0.04,uv);
        n=C(n,n1);
        n1=Line(vec2(center.x-0.207,center.y+0.007),vec2(center.x-0.1,center.y+0.007),0.01,uv);
        n=B(n,n1);
        n1=Line(vec2(center.x-0.207,center.y-0.007),vec2(center.x-0.1,center.y-0.007),0.01,uv);
        n=B(n,n1);
        n1=Line(vec2(center.x-0.203,center.y-0.02),vec2(center.x-0.203,center.y+0.02),0.004,uv);
        n=B(n,n1);
        vec4 layer13=render(n,vec3(0.05,0.05,0.05),0);   
 BG 
        vec2 p = (2.0*fragCoord.xy-iResolution.xy)/min(iResolution.y,iResolution.x);
        vec3 bcol = vec3(0.76,0.13,0.11-0.07*p.y)*(1.0-0.25*length(p));//BackGround
        vec4 fragColor = vec4(bcol, 1.0); 
        fragColor.rgb = mix(fragColor.rgb, layer13.rgb, layer13.a);//darkGun
        fragColor.rgb = mix(fragColor.rgb, layer9.rgb, layer9.a);//darkRed,body
        fragColor.rgb = mix(fragColor.rgb, layer5.rgb, layer5.a);//red(body)
        fragColor.rgb = mix(fragColor.rgb, layer0.rgb, layer0.a);//red
        fragColor.rgb = mix(fragColor.rgb, layer3.rgb, layer3.a);//darkRed
        fragColor.rgb = mix(fragColor.rgb, layer4.rgb, layer4.a);//yellow
        fragColor.rgb = mix(fragColor.rgb, layer6.rgb, layer6.a);//yellow,plus
        fragColor.rgb = mix(fragColor.rgb, layer1.rgb, layer1.a);//black
        fragColor.rgb = mix(fragColor.rgb, layer2.rgb, layer2.a);//white
        fragColor.rgb = mix(fragColor.rgb, layer7.rgb, layer7.a);//green
        fragColor.rgb = mix(fragColor.rgb, layer8.rgb, layer8.a);//darkGreen
        fragColor.rgb = mix(fragColor.rgb, layer10.rgb, layer10.a);//darkKnife
        fragColor.rgb = mix(fragColor.rgb, layer11.rgb, layer11.a);//lightKnife
        fragColor.rgb = mix(fragColor.rgb, layer12.rgb, layer12.a);//blackKnife

        return fragColor;
    }

    ENDCG

    SubShader {
        Pass {
            CGPROGRAM

            #pragma vertex vert
            #pragma fragment frag
            #pragma fragmentoption ARB_precision_hint_fastest   

            ENDCG
        }
    } 
    FallBack off
}

欢迎收藏东方喵的博客 http://blog.csdn.net/qq_31794491
东方喵 著

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值