久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

OpenGL Shader實例分析(7)雪花飄落效果

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

研究了一個雪花飄落效果,感覺挺不錯的,分享給大家,效果如下:

代碼如下:


Shader "shadertoy/Flakes" { // https://www.shadertoy.com/view/4d2Xzc
 Properties{
 iMouse ("Mouse Pos", Vector) = (100,100,0,0)
 iChannel0("iChannel0", 2D) = "white" {} 
 iChannelResolution0 ("iChannelResolution0", Vector) = (100,100,0,0)
 }
 
 CGINCLUDE 
 #include "UnityCG.cginc" 
 #pragma target 3.0 
 #pragma glsl
 
 #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.srcPos.xy/_iParam.srcPos.w)*_ScreenParams.xy) 
 
 #define PI2 6.28318530718
 #define pi 3.14159265358979
 #define halfpi (pi * 0.5)
 #define oneoverpi (1.0 / pi)
 
 fixed4 iMouse;
 sampler2D iChannel0;
 fixed4 iChannelResolution0;
 
 struct v2f { 
  float4 pos : SV_POSITION; 
  float4 srcPos : TEXCOORD0; 
 };  
 
 // precision highp float;
 v2f vert(appdata_base v){ 
  v2f o;
  o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
  o.srcPos = ComputeScreenPos(o.pos); 
  return o; 
 } 
 
 vec4 main(v2f _iParam);
 
 fixed4 frag(v2f _iParam) : COLOR0 { 
 return main(_iParam);
 } 
 
 
 vec4 main(v2f _iParam) {
 vec2 p = gl_FragCoord.xy/iResolution.xy;
 vec3 col = vec3(0,0,0);
 float dd = 150;
 for( int i=0; i<dd; i++ )
 {
  float an = 6.2831*float(i)/dd;
  vec2 of = vec2( cos(an), sin(an) ) * (1.0+0.6*cos(7.0*an+iGlobalTime)) + vec2( 0.0, iGlobalTime );
  col = max( col, texture2D( iChannel0, p + 20*of/iResolution.xy ).xyz );
  col = max( col, texture2D( iChannel0, p + 5.0*of/iResolution.xy ).xyz );
 }
 col = pow( col, vec3(1.0,2.0,3.0) ) * pow( 4.0*p.y*(1.0-p.y), 0.2);
 
 return vec4( col, 1.0 );
 }
 
 ENDCG 
 
 SubShader { 
 Pass { 
  CGPROGRAM 
 
  #pragma vertex vert 
  #pragma fragment frag 
  #pragma fragmentoption ARB_precision_hint_fastest 
 
  ENDCG 
 } 
 } 
 FallBack Off 
}

代碼分析:

1)七邊形雪花的繪制算法

具體代碼如下:


float dd = 150;
for( int i=0; i<dd; i++ )
{
 float an = 6.2831*float(i)/dd;
 vec2 of = vec2( cos(an), sin(an) ) * (1.0+0.6*cos(7.0*an+iGlobalTime)) + vec2( 0.0, iGlobalTime );
 col = max( col, texture2D( iChannel0, p + 20*of/iResolution.xy ).xyz );
 col = max( col, texture2D( iChannel0, p + 5.0*of/iResolution.xy ).xyz );
}

在理解這段代碼前,先理解怎么畫一個圈,代碼如下:


float dd = 30;
for( int i=0; i<dd; i++ )
{
 float an = 6.2831*float(i)/dd;
 vec2 of = vec2( cos(an), sin(an) );
 col = max( col, texture2D( iChannel0, p + 20*of/iResolution.xy ).xyz );
}

然后再準備一張貼圖,圖片中間是一個白色像素,周圍都是黑色

效果如下:

這段代碼處于fragment shader中,意味著屏幕上每個點都會進行上述的算法。具體如下,遍歷貼圖中該點周圍的點(上面的代碼中為距離該點為20單位的圓上的點),把周圍點中最亮的作為該點的顏色。 上面的貼圖有點特殊,只有一個點是白色,其余點都是黑色的。那么只有距離該點正好為20單位的點才會變成亮色,其余的點都是黑色,如上圖的結果。一句話總結上面算法的效果:貼圖中的每一個“相對亮點”的周圍都會產生“相對亮的特定圖形”,圖形的亮度取決于該點的亮度,越亮越明顯。效果可以參考文末的圖片。

接下來理解這段代碼:


float dd = 150;
for( int i=0; i<dd; i++ )
{
 float an = 6.2831*float(i)/dd;
 vec2 of = vec2( cos(an), sin(an) ) * (1.0+0.7*cos(7.0*an));
 col = max( col, texture2D( iChannel0, p + 20*of/iResolution.xy ).xyz );
// col = max( col, texture2D( iChannel0, p + 5.0*of/iResolution.xy ).xyz );
}

輸出結果如下:


a)  1.0+0.7*cos(7.0*an)的圖像如下:

b)算法中 of 向量的路徑為:

結果就很清晰了;其實這里算法和《【OpenGL】Shader實例分析(二)- Heart》中繪制心形的算法很類似。

最后加上時間就可以實現動畫了:


vec2 of = vec2( cos(an), sin(an) ) * (1.0+0.6*cos(7.0*an+iGlobalTime)) + vec2( 0.0, iGlobalTime );

第一個iGlobalTime,用來控制雪花的旋轉,第二個iGlobalTime使雪花下落。

2)后期顏色等處理

這里可以理解為一種postEffect處理,具體是如下的代碼貢獻的效果:


col = pow( col, vec3(1.0,2.0,3.0) ) * pow( 4.0*p.y*(1.0-p.y), 0.2);

a)  pow(col, vec3(1.0, 2.0, 3.0)) 這句話使得顏色變成暖色調。col值的范圍為[0,1],對小數繼續pow運算,次數越高,該值越小。比如:0.5的1次方是0.5, 2次方為0.25, 3次方為0.125等;所以這句話的作用很明顯:red成份不變,green變小一些,blue變的更小。達到的效果,使得整體顏色會偏向暖色調。

b)pow(4.0*p.y*(1.0-p.y), 0.2) 使得屏幕上下兩邊變暗。

最后附上shader中用到的貼圖:

經過程序處理后,得到如下:

文章完畢,歡迎討論。

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

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

相關文檔推薦

這篇文章主要為大家詳細介紹了OpenGL Shader實例分析第4篇,實現閃光效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
這篇文章主要介紹了OpenGL Shader實例分析第3篇,等待標識效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
這篇文章主要為大家詳細介紹了OpenGL Shader實例分析第2篇,繪制心臟跳動效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
這篇文章主要為大家詳細介紹了OpenGL Shader實例分析第一篇,Wave效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
這篇文章主要為大家詳細介紹了OpenGL Shader實例分析第8篇,彩色光圈效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
主站蜘蛛池模板: 久久久久久九九九九 | 99精品视频一区二区三区 | 一区免费观看 | 无码国模国产在线观看 | 91精品国产综合久久香蕉麻豆 | 91精品综合久久久久久五月天 | 伦理午夜电影免费观看 | 久久大 | 久久精品福利 | 91免费高清视频 | 国产一区二区不卡 | 伊人久操| 国产一区二区三区四区 | 久久久91精品国产一区二区精品 | 国产美女一区二区 | 久久99深爱久久99精品 | 久久99久久98精品免观看软件 | 91久久精品国产 | 久久91 | 久久久久国产精品午夜一区 | 一区在线观看 | 中文字幕高清在线 | 国产精品99久久免费观看 | 在线黄av| 亚洲乱码国产乱码精品精的特点 | 91久久精品 | 亚洲 中文 欧美 日韩 在线观看 | 999视频| 国产精品日韩一区二区 | 国产午夜精品一区二区三区四区 | 一区二区三区视频在线观看 | 五月天婷婷综合 | 特a毛片| 久久国产精品视频 | 欧美另类视频在线 | 狠狠色综合久久婷婷 | 久久精品亚洲成在人线av网址 | 色在线看 | 99精品欧美一区二区三区综合在线 | 99久久电影 | 日日操夜夜操天天操 |