亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

OpenGL Shader實例分析(1)Wave效果

2019-10-21 21:25:02
字體:
來源:轉載
供稿:網友

這篇文章主要分析一個Shader,從而感受shader的魅力,并學習相關shader的函數的用法。

先看Shader運行的效果:

OpenGL,Shader,Wave

下面是代碼:

Shader "shadertoy/Waves" { //see https://www.shadertoy.com/view/4dsGzH  CGINCLUDE   #include "UnityCG.cginc"        #pragma target 3.0  struct vertOut {   float4 pos:SV_POSITION;   float4 srcPos;  };  vertOut vert(appdata_base v) {  vertOut o;  o.pos = mul (UNITY_MATRIX_MVP, v.vertex);  o.srcPos = ComputeScreenPos(o.pos);  return o; }  fixed4 frag(vertOut i) : COLOR0 {   fixed3 COLOR1 = fixed3(0.0,0.0,0.3);  fixed3 COLOR2 = fixed3(0.5,0.0,0.0);  float BLOCK_WIDTH = 0.03;   float2 uv = (i.srcPos.xy/i.srcPos.w);   // To create the BG pattern  fixed3 final_color = fixed3(1.0);  fixed3 bg_color = fixed3(0.0);  fixed3 wave_color = fixed3(0.0);   float c1 = fmod(uv.x, 2.0* BLOCK_WIDTH);  c1 = step(BLOCK_WIDTH, c1);  float c2 = fmod(uv.y, 2.0* BLOCK_WIDTH);  c2 = step(BLOCK_WIDTH, c2);  bg_color = lerp(uv.x * COLOR1, uv.y * COLOR2, c1*c2);   // TO create the waves   float wave_width = 0.01;  uv = -1.0 + 2.0*uv;  uv.y += 0.1;  for(float i=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;   return fixed4(final_color, 1.0); }  ENDCG   SubShader {  Pass {   CGPROGRAM    #pragma vertex vert   #pragma fragment frag   #pragma fragmentoption ARB_precision_hint_fastest     ENDCG  }   }   FallBack Off }

下面進行分析:

1. ComputeScreenPos的解析:

用于把三維的坐標轉化為屏幕上的點。有兩種方式,請參考 官方例子

ComputeScreenPos在UnityCG.cginc文件中定義如下:

// Projected screen position helpers#define V2F_SCREEN_TYPE float4inline float4 ComputeScreenPos (float4 pos) { float4 o = pos * 0.5f; #if defined(UNITY_HALF_TEXEL_OFFSET) o.xy = float2(o.x, o.y*_ProjectionParams.x) + o.w * _ScreenParams.zw; #else o.xy = float2(o.x, o.y*_ProjectionParams.x) + o.w; #endif  #if defined(SHADER_API_FLASH) o.xy *= unity_NPOTScale.xy; #endif  o.zw = pos.zw; return o;}

原理解析(待續)

2. 背景的繪制

2.1) fmod用于求余數,比如fmod(1.5, 1.0) 返回0.5;

2.2) step用于大小的比較,step(a,x) :  0 if x<a; 1 if x>=a; 比如: step(1, 1.2), 返回1; step(1, 0.8) 返回0;

2.3) 結合fmod和step可以得到一個虛線的效果。 比如要得到虛線段長度為1的代碼如下:

c1 = fmod(x, 2*width); c1=step(width,c1); //其中width為1

那么如果x的范圍是[0,1),c1的值為0;范圍為[1,2),c1的值為1;2為一個周期;

那么fmod起到了制作周期的作用,step計算周期內的0和1;

2.4)把2.3中的知識運用到2維,就可以計算出方塊。

lerp函數的用法:lerp( a , b ,f ), f為百分數(取值范圍[0,1]);如果f為0,則lerp返回a,f為1,則返回b。f為0到1之間,就返回a到b之間的值。

代碼中的 lerp(uv.x * COLOR1, uv.y * COLOR2, c1*c2); 其中c1和c2的取值不是為1,就是為0,所以就可以變成網格的情況。 背景繪制如下:

OpenGL,Shader,Wave

3. 波紋的繪制

3.1 ) 坐標的轉化

uv = -1.0 + 2.0*uv;  // 把原始的uv進行擴展和位移,得到新的uv。我們的操作就是在新的uv上進行的,最終顯示時會映射到原來到uv,請參考下圖

OpenGL,Shader,Wave

3.2 )  畫一條直線:

由于上面把y軸移動到屏幕的中心,所以屏幕的上半部分為正的,下半部分為負的,代碼如下:

wave_width = abs(1.0 / (50.0 * uv.y));wave_color = fixed3(wave_width * 1.9, wave_width, wave_width * 1.5);

其中50.0是用來控制線的寬度的(數值越大,線越細),效果如下:

OpenGL,Shader,Wave

3.3)把直線變為曲線,并使其動起來:

uv.y += (0.07 * sin(uv.x*10 + _Time.y));wave_width = abs(1.0 / (50.0 * uv.y));wave_color = fixed3(wave_width * 1.9, wave_width, wave_width * 1.5);

效果如下:

OpenGL,Shader,Wave

3.4)多畫幾條曲線,形成波浪:

for(float i=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);}

最終效果請見文章開頭。

其實寫shader,很多時候都是要通過不斷地效果疊加并調試來達到效果。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
中文字幕九色91在线| 亚洲国产精彩中文乱码av在线播放| 蜜臀久久99精品久久久无需会员| 91视频免费在线| 久久成人人人人精品欧| 91久久久在线| 久久精品电影一区二区| 日韩成人中文字幕| 日本国产精品视频| 欧美一级视频一区二区| 日韩女优人人人人射在线视频| 欧美激情免费观看| 日本不卡高字幕在线2019| 97精品在线视频| 精品成人在线视频| 国产精品永久免费| 精品国产精品三级精品av网址| 久久欧美在线电影| 欧美性猛交xxxx乱大交蜜桃| 日韩欧美福利视频| 日韩视频欧美视频| 欧美日韩精品中文字幕| 亚洲最大激情中文字幕| 亚洲级视频在线观看免费1级| 欧美裸体xxxx极品少妇| 亚洲欧美资源在线| 日韩二区三区在线| 日本三级韩国三级久久| 欧美大片免费观看在线观看网站推荐| 久久人人97超碰精品888| 亚洲桃花岛网站| 亚洲激情自拍图| 欧美激情欧美激情| 丝袜情趣国产精品| 欧美国产亚洲精品久久久8v| 不卡在线观看电视剧完整版| 91免费人成网站在线观看18| 国产精品96久久久久久| 日韩天堂在线视频| 久久69精品久久久久久久电影好| 欧美激情综合亚洲一二区| 亲爱的老师9免费观看全集电视剧| 性欧美xxxx交| 欧美性20hd另类| 国产精品视频不卡| 成人激情在线观看| 国产999在线| 精品成人久久av| 亚洲老板91色精品久久| 久久久久久久国产精品视频| 国产精品亚洲自拍| 国产精品视频资源| 欧美激情a∨在线视频播放| 成人免费网站在线| 亚洲国产成人精品一区二区| 国产精品久久久av久久久| 亚洲国产成人精品久久久国产成人一区| 欧美中文在线观看| 精品久久久久久久久久国产| 亚洲最大av网| 国产性色av一区二区| 久青草国产97香蕉在线视频| 国产一区二区久久精品| 久久亚洲国产精品成人av秋霞| 欧美色videos| 国产综合久久久久| 国产精品18久久久久久麻辣| 欧美黑人一区二区三区| 91国产中文字幕| 日韩在线中文字幕| 久久人人97超碰精品888| 日日狠狠久久偷偷四色综合免费| 在线国产精品视频| 精品欧美aⅴ在线网站| 亚洲成人久久一区| 亚洲国产另类 国产精品国产免费| 色777狠狠综合秋免鲁丝| 欧美在线视频一区二区| 美女视频黄免费的亚洲男人天堂| 亚洲韩国青草视频| 51ⅴ精品国产91久久久久久| 国产精品99一区| 亚洲精品网站在线播放gif| 欧美在线观看网址综合| 日韩美女视频在线观看| 菠萝蜜影院一区二区免费| 国产日韩在线看片| 亚洲精品一区中文字幕乱码| 美女福利精品视频| 欧美多人爱爱视频网站| 亚洲xxxxx| 91精品国产九九九久久久亚洲| 精品视频在线观看日韩| 中文字幕日韩综合av| 色99之美女主播在线视频| 97在线免费观看视频| 96sao精品视频在线观看| 萌白酱国产一区二区| 欧美精品18videosex性欧美| 亚洲欧美日韩在线高清直播| 亚洲人成电影网站| 欧美中文字幕视频| 日本午夜在线亚洲.国产| 成人免费视频xnxx.com| 国模精品视频一区二区| 国内精品视频久久| 成人性生交xxxxx网站| 97av在线播放| 欧美性黄网官网| 91精品久久久久久久久| 亚洲午夜av电影| 国产精品美女网站| 91精品国产777在线观看| 青青久久av北条麻妃黑人| 国产精品精品视频一区二区三区| 国产成人精品a视频一区www| 国产精品男人爽免费视频1| 精品自拍视频在线观看| 亚洲美女在线观看| 98视频在线噜噜噜国产| 亚洲性日韩精品一区二区| 欧美日韩另类字幕中文| 一二美女精品欧洲| 日韩av在线网站| 全球成人中文在线| 国产欧美日韩免费| 一二美女精品欧洲| 亚洲欧美一区二区三区情侣bbw| 亚洲精品电影在线| 欧美孕妇与黑人孕交| 国外成人在线播放| 欧美一区二区视频97| 91av在线免费观看视频| 亚洲国产第一页| 国产亚洲综合久久| 国语自产精品视频在线看一大j8| 国产成人极品视频| 亚洲色图五月天| 欧美激情一区二区三区在线视频观看| 久久色免费在线视频| 成人欧美一区二区三区在线| 欧美精品在线免费播放| 精品国产一区二区三区久久狼黑人| 69av在线播放| 在线观看成人黄色| 国内偷自视频区视频综合| 国产精品自产拍在线观看| 国产精品扒开腿做爽爽爽的视频| 国产亚洲精品一区二区| 成人两性免费视频| 中文字幕欧美精品在线| 日本电影亚洲天堂| 亚洲人成亚洲人成在线观看| 精品久久久久久久久久久久久久| 欧美激情视频在线免费观看 欧美视频免费一| 亚洲国产成人在线视频| 久久亚洲综合国产精品99麻豆精品福利| 91精品国产综合久久香蕉的用户体验| 国产精品美女www爽爽爽视频| 亚洲精品456在线播放狼人| 亚洲成色www8888| 九九热最新视频//这里只有精品| 欧美精品免费在线观看| 久久免费视频观看|