转发请保持地址:http://www.jb51.cc/article/p-bzdgsshf-bap.html
这篇文章主要分析一个Shader,从而感受shader的魅力,并学习相关shader的函数的用法。
先看Shader运行的效果(随着时间移动的波浪,具体效果请参考https://www.shadertoy.com/view/4dsGzH):
下面是代码:
@H_502_12@
- Shader"shadertoy/Waves"{//seehttps://www.shadertoy.com/view/4dsGzH
- CGINCLUDE
- #include"UnityCG.cginc"
- #pragmatarget3.0
- structvertOut{
- float4pos:SV_POSITION;
- float4srcPos;
- };
- vertOutvert(appdata_basev){
- vertOuto;
- o.pos=mul(UNITY_MATRIX_MVP,v.vertex);
- o.srcPos=ComputeScreenPos(o.pos);
- returno;
- }
- fixed4frag(vertOuti):COLOR0{
- fixed3COLOR1=fixed3(0.0,0.0,0.3);
- fixed3COLOR2=fixed3(0.5,0.0);
- floatBLOCK_WIDTH=0.03;
- float2uv=(i.srcPos.xy/i.srcPos.w);
- //TocreatetheBGpattern
- fixed3final_color=fixed3(1.0);
- fixed3bg_color=fixed3(0.0);
- fixed3wave_color=fixed3(0.0);
- floatc1=fmod(uv.x,2.0*BLOCK_WIDTH);
- c1=step(BLOCK_WIDTH,c1);
- floatc2=fmod(uv.y,108); color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> c2=step(BLOCK_WIDTH,c2);
- bg_color=lerp(uv.x*COLOR1,uv.y*COLOR2,c1*c2);
- //TOcreatethewaves
- floatwave_width=0.01;
- uv=-1.0+2.0*uv;
- uv.y+=0.1;
- for(floati=0.0;i<10.0;i++){
- uv.y+=(0.07*sin(uv.x+i/7.0+_Time.y));
- wave_width=abs(1.0/(150.0*uv.y));
- wave_color+=fixed3(wave_width*1.9,wave_width,wave_width*1.5);
- }
- final_color=bg_color+wave_color;
- returnfixed4(final_color,1.0);
- ENDCG
- SubShader{
- Pass{
- CGPROGRAM
- #pragmavertexvert
- #pragmafragmentfrag
- #pragmafragmentoptionARB_precision_hint_fastest
- FallBackOff
- }