pbootcms网站模板|日韩1区2区|织梦模板||网站源码|日韩1区2区|jquery建站特效-html5模板网

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

這篇文章主要為大家詳細介紹了OpenGL Shader實例分析第一篇,Wave效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下

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

先看Shader運行的效果:

下面是代碼:


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 float4
inline 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,所以就可以變成網格的情況。 背景繪制如下:

3. 波紋的繪制

3.1 ) 坐標的轉化

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

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是用來控制線的寬度的(數值越大,線越細),效果如下:

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);

效果如下:

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,很多時候都是要通過不斷地效果疊加并調試來達到效果。

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

【網站聲明】本站部分內容來源于互聯網,旨在幫助大家更快的解決問題,如果有圖片或者內容侵犯了您的權益,請聯系我們刪除處理,感謝您的支持!

相關文檔推薦

這篇文章主要為大家詳細介紹了OpenGL Shader實例分析第7篇,實現雪花飄落效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
這篇文章主要為大家詳細介紹了OpenGL Shader實例分析第4篇,實現閃光效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
這篇文章主要介紹了OpenGL Shader實例分析第3篇,等待標識效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
這篇文章主要為大家詳細介紹了OpenGL Shader實例分析第2篇,繪制心臟跳動效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
這篇文章主要為大家詳細介紹了OpenGL Shader實例分析第8篇,彩色光圈效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
主站蜘蛛池模板: 上海佳武自动化科技有限公司| 湖南自考_湖南自学考试网 | 上海小程序开发-小程序制作-上海小程序定制开发公司-微信商城小程序-上海咏熠 | 粘度计NDJ-5S,粘度计NDJ-8S,越平水分测定仪-上海右一仪器有限公司 | 北京包装设计_标志设计公司_包装设计公司-北京思逸品牌设计 | 量子管通环-自清洗过滤器-全自动反冲洗过滤器-沼河浸过滤器 | SOUNDWELL 编码器|电位器|旋转编码器|可调电位器|编码开关厂家-广东升威电子制品有限公司 | 学校用栓剂模,玻璃瓶轧盖钳,小型安瓿熔封机,实验室安瓿熔封机-长沙中亚制药设备有限公司 | 气力输送设备_料封泵_仓泵_散装机_气化板_压力释放阀-河南锐驰机械设备有限公司 | 应急灯_消防应急灯_应急照明灯_应急灯厂家-大成智慧官网 | 哈希PC1R1A,哈希CA9300,哈希SC4500-上海鑫嵩实业有限公司 | 陕西华春网络科技股份有限公司 | 两头忙,井下装载机,伸缩臂装载机,30装载机/铲车,50装载机/铲车厂家_价格-莱州巨浪机械有限公司 | 中细软知识产权_专业知识产权解决方案提供商 | 不锈钢发酵罐_水果酒发酵罐_谷物发酵罐_山东誉诚不锈钢制品有限公司 | 东莞画册设计_logo/vi设计_品牌包装设计 - 华略品牌设计公司 | 耳模扫描仪-定制耳机设计软件-DLP打印机-asiga打印机-fitshape「飞特西普」 | 绿萝净除甲醛|深圳除甲醛公司|测甲醛怎么收费|培训机构|电影院|办公室|车内|室内除甲醛案例|原理|方法|价格立马咨询 | 杭州用友|用友软件|用友财务软件|用友ERP系统--杭州协友软件官网 | 东莞韩创-专业绝缘骨架|马达塑胶零件|塑胶电机配件|塑封电机骨架厂家 | 网站建设,北京网站建设,北京网站建设公司,网站系统开发,北京网站制作公司,响应式网站,做网站公司,海淀做网站,朝阳做网站,昌平做网站,建站公司 | 全自动固相萃取仪_高通量真空平行浓缩仪-勤业永为 | 合肥抖音SEO网站优化-网站建设-网络推广营销公司-百度爱采购-安徽企匠科技 | 玻璃瓶厂家_酱菜瓶厂家_饮料瓶厂家_酒瓶厂家_玻璃杯厂家_徐州东明玻璃制品有限公司 | 液压压力机,液压折弯机,液压剪板机,模锻液压机-鲁南新力机床有限公司 | 火锅底料批发-串串香技术培训[川禾川调官网] | 骨灰存放架|骨灰盒寄存架|骨灰架厂家|智慧殡葬|公墓陵园管理系统|网上祭奠|告别厅智能化-厦门慈愿科技 | 环氧铁红防锈漆_环氧漆_无溶剂环氧涂料_环氧防腐漆-华川涂料 | 福建成考网-福建成人高考网| 佛山市钱丰金属不锈钢蜂窝板定制厂家|不锈钢装饰线条|不锈钢屏风| 电梯装饰板|不锈钢蜂窝板不锈钢工艺板材厂家佛山市钱丰金属制品有限公司 | 东莞办公家具厂家直销-美鑫【免费3D效果图】全国办公桌/会议桌定制 | 云南外加剂,云南速凝剂,云南外加剂代加工-普洱澜湄新材料科技有限公司 | 陕西安闸机-伸缩门-车牌识别-广告道闸——捷申达门业科技 | 洗砂机械-球磨制砂机-洗沙制砂机械设备_青州冠诚重工机械有限公司 | 专业生物有机肥造粒机,粉状有机肥生产线,槽式翻堆机厂家-郑州华之强重工科技有限公司 | 浙江建筑资质代办_二级房建_市政_电力_安许_劳务资质办理公司 | 密封圈_泛塞封_格莱圈-[东莞市国昊密封圈科技有限公司]专注密封圈定制生产厂家 | 有机肥设备生产制造厂家,BB掺混肥搅拌机、复合肥设备生产线,有机肥料全部加工设备多少钱,对辊挤压造粒机,有机肥造粒设备 -- 郑州程翔重工机械有限公司 | 气动球阀_衬氟蝶阀_调节阀_电动截止阀_上海沃托阀门有限公司 | Eiafans.com_环评爱好者 环评网|环评论坛|环评报告公示网|竣工环保验收公示网|环保验收报告公示网|环保自主验收公示|环评公示网|环保公示网|注册环评工程师|环境影响评价|环评师|规划环评|环评报告|环评考试网|环评论坛 - Powered by Discuz! | 干粉砂浆设备_干混砂浆生产线_腻子粉加工设备_石膏抹灰砂浆生产成套设备厂家_干粉混合设备_砂子烘干机--郑州铭将机械设备有限公司 |