死侍(DeadPool)
2016-07-29 15:35
411 查看
前两天看完《死侍》,作为死侍狂热者的我,自然感觉不过瘾,便决定动动手,搞点儿诡异的东西~
首先呢,这不是图片,而是完全由Pixel Shader绘制而成的;
其次呢,当下手机是不支持Pixel Shader的;
然后呢,完全是想到哪写到哪,没经过任何优化调整(请让我懒死~);
故而呢,Just for fun~
开心就好~
贴在一个UGUI的image上,效果如图:
![](https://img-blog.csdn.net/20160729151030955)
附上异常冗长的shader:
欢迎收藏东方喵的博客 http://blog.csdn.net/qq_31794491
东方喵 著
首先呢,这不是图片,而是完全由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< 4000 /span>,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 10bd5 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
东方喵 著
相关文章推荐
- unity实现多点触控代码
- 在Unity中实现动画的正反播放代码
- Unity UGUI教程之实现滑页效果
- unity实现摄像头跟随
- Unity3D上路_01-2D太空射击游戏
- Unity3D上路_02-第一视角射击游戏
- Unity3D上路_03-塔防游戏
- Unity3D上路_04-基础资源介绍
- Unity3D上路_05-网络相关
- Unity3D-5.3.5发布VR项目到Android
- unity 新UI草稿
- [软件资讯]Unity已支持将3D游戏导出成Flash
- ShaderLab: Pass
- Unity 武器拖尾效果
- unity常见问题之20题
- 反编译ARB program to GLSL shader日记
- Unity3D动画存储插件
- unity 赛车相机跟随物体移动
- uLua中遇到的问题
- Unity3d 协程、调用函数、委托