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

首頁 > 系統 > Android > 正文

OpenGL Shader實例分析(8)彩色光圈效果

2019-10-21 21:24:53
字體:
來源:轉載
供稿:網友

本文實例為大家分享了OpenGL實現彩色光圈效果的具體代碼,供大家參考,具體內容如下

研究了一個彩色光圈效果,感覺挺不錯的,分享給大家,效果如下:

OpenGL,Shader,彩色光圈

代碼如下:

Shader "shadertoy/TotalNoob" { //https://www.shadertoy.com/view/XdlSDs 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 // mod = sign*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 = (2.0*gl_FragCoord.xy-iResolution.xy)/iResolution.y; float tau = 3.1415926535*2.0; float a = atan(p.x,p.y); float r = length(p)*0.75; vec2 uv = vec2(a/tau,r);  //get the color float xCol = (uv.x - (iGlobalTime / 3.0)) * 3.0; xCol = sign(xCol)*fmod(xCol, 3.0); vec3 horColour = vec3(0.25, 0.25, 0.25);  if (xCol < 1.0) { horColour.r += 1.0 - xCol; horColour.g += xCol; } else if (xCol < 2.0) { xCol -= 1.0; horColour.g += 1.0 - xCol; horColour.b += xCol; } else { xCol -= 2.0; horColour.b += 1.0 - xCol; horColour.r += xCol; }  // draw color beam uv = (2.0 * uv) - 1.0; float beamWidth = (0.7+0.5*cos(uv.x*10.0*tau*0.15*clamp(floor(5.0 + 10.0*cos(iGlobalTime)), 0.0, 10.0))) * abs(1.0 / (30.0 * uv.y)); vec3 horBeam = vec3(beamWidth,beamWidth,beamWidth); vec4 gl_FragColor = vec4((( horBeam)* horColour ), 1.0);  return gl_FragColor; }  ENDCG  SubShader {  Pass {  CGPROGRAM  #pragma vertex vert  #pragma fragment frag  #pragma fragmentoption ARB_precision_hint_fastest  ENDCG  }  }  FallBack Off }

代碼分析

代碼分兩部分,顏色 * 光圈,如下圖:

OpenGL,Shader,彩色光圈 * OpenGL,Shader,彩色光圈 = OpenGL,Shader,彩色光圈

彩色的算法

代碼如下:

vec2 p = (2.0*gl_FragCoord.xy-iResolution.xy)/iResolution.y;float tau = 3.1415926535*2.0;float a = atan(p.x,p.y);float r = length(p)*0.75;vec2 uv = vec2(a/tau,r); //get the colorfloat xCol = (uv.x - (iGlobalTime / 3.0)) * 3.0;xCol = mod(xCol, 3.0);vec3 horColour = vec3(0.25, 0.25, 0.25); if (xCol < 1.0) { horColour.r += 1.0 - xCol; horColour.g += xCol;} else if (xCol < 2.0) { xCol -= 1.0; horColour.g += 1.0 - xCol; horColour.b += xCol;} else { xCol -= 2.0; horColour.b += 1.0 - xCol; horColour.r += xCol;}

這段代碼是寫在fragment shader中的,也就是說,每個像素點的渲染都會調用這段代碼。

a) vec2 p = (2.0*gl_FragCoord.xy-iResolution.xy)/iResolution.y;

p表示把當前的坐標軸縮小到原來的1/2,原點移動到屏幕中間,并把x,y軸的坐標范圍縮小到1左右的值(即p的y軸范圍在-1到1之間,x軸的范圍也在附近);

b)float a = atan(p.x, p.y);

a表示p點繞原點的角度,范圍為[-π,π];所以uv.x = a/tau的范圍為[-1/2, 1/2];

float xCol = (uv.x - (iGlobalTime / 3.0)) * 3.0; xCol=mod(xCol, 3)的范圍為 [0,3]

c) xCol經過上面處理,其范圍為[0,3]; 現在把這個范圍平均分成3份,每一份做一個顏色的混合:

[0,1]:Red和Green混合;[1,2]:Green和Blue混合;[2,3]:Blue和Red混合。

光圈的算法

a)畫光圈

式子:abs(1.0 / (30.0*uv.y)) 

知識:在shader中,如果color的值為負數,則認為是0,不顯示該顏色。

uv變量中uv.y表示點到原點的距離,值的范圍為 [0, ]

a-1) uv = (2.0 * uv) - 1.0;  先把uv縮小到原來的1/2,然后向外移動1單位。uv.y的值為[-1/2, ];由于負值color不被顯示,如下圖A:

a-2) 1.0/(30.0* uv.y); 縮小到原來的1/30,并做個倒數,如下圖B

a-3) abs(1.0/(30.0* uv.y)); 然后做個絕對值,如下圖C

OpenGL,Shader,彩色光圈=》OpenGL,Shader,彩色光圈=》OpenGL,Shader,彩色光圈

畫光圈的算法和《【OpenGL】Shader實例分析(一)-Wave》中畫線的算法很類似。

b)光圈動畫 

式子:(0.7+0.5*cos(uv.x*10.0*tau*0.15*clamp(floor(5.0 + 10.0*cos(iGlobalTime)), 0.0, 10.0)))

為了方便,把上面的式子分解如下:

式1:float tt = 5.0 + 10.0*cos(iGlobalTime); 
式2:float param = clamp(floor(tt), 0.0, 10.0);
式3:float beamWidth = (0.7+0.5*cos(uv.x*pi*param));

我們把beamWidth作為顏色輸出;

先理解式3,如果當param為0,、1、2、3、10時,分別參考下圖: 

OpenGL,Shader,彩色光圈 =》 OpenGL,Shader,彩色光圈 =》OpenGL,Shader,彩色光圈=》 OpenGL,Shader,彩色光圈=》OpenGL,Shader,彩色光圈

式2的作用,把tt的值做一個包裝,使其為0到10之間的整數

式1的作用,起周期作用,值域為[-5,15]; 其值如左下圖所示; 又由于式2做了clamp,把大于10和小于0的值去掉,最終的動畫如右下圖所示:

OpenGL,Shader,彩色光圈 ====》OpenGL,Shader,彩色光圈

把光圈和顏色整合起來就看到了和文章開頭的動畫一樣的效果了。

最后吧所有的效果整合起來,如下圖:

【彩色】 => 【彩色旋轉】 =》【彩色旋轉+動畫】 =》【彩色旋轉+動畫+光圈】

OpenGL,Shader,彩色光圈=》OpenGL,Shader,彩色光圈=》OpenGL,Shader,彩色光圈=》OpenGL,Shader,彩色光圈

本次分析到此結束,歡迎討論。

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


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美电影免费播放| 精品国产91久久久久久| 亚洲va欧美va国产综合剧情| 亚洲国产精品人久久电影| 日韩暖暖在线视频| 国产成人短视频| 欧美韩国理论所午夜片917电影| 国产日韩欧美另类| 97在线视频免费播放| 538国产精品视频一区二区| 中文字幕日韩专区| 国产精品人成电影在线观看| 国产午夜精品全部视频播放| 91欧美精品成人综合在线观看| 国内外成人免费激情在线视频网站| 亚洲国产精品中文| 亚洲精品免费网站| 日韩电影中文字幕在线观看| 国产一级揄自揄精品视频| 亚洲欧洲中文天堂| 国产精品白丝jk喷水视频一区| 国产成人精品视频在线| 国产91在线高潮白浆在线观看| 97久久精品视频| 国产欧美欧洲在线观看| 欧美在线视频一区二区| 一区二区成人精品| 日韩欧美在线观看| 久久精品亚洲国产| 久久99国产精品久久久久久久久| 国产精品自产拍在线观看中文| 日韩中文在线中文网三级| 国产午夜精品视频| 亚洲视频电影图片偷拍一区| 国产精品视频网| 国产91精品久久久久久久| 日韩电影视频免费| 久久6精品影院| 色妞久久福利网| 国产精品久久久久久久久借妻| 久久久久久久久久久久av| 7777精品久久久久久| 97色在线观看| 亚洲性线免费观看视频成熟| 中文.日本.精品| 欧美特级www| 伊人伊成久久人综合网站| 在线电影欧美日韩一区二区私密| 中文字幕久久精品| 国产欧美日韩91| 欧美巨大黑人极品精男| 性金发美女69hd大尺寸| 精品性高朝久久久久久久| 亚洲欧美日韩一区二区在线| 91av视频在线| 亚洲最大成人免费视频| 国产精品入口尤物| 97视频在线播放| 国产suv精品一区二区| 成人黄色在线播放| 中文字幕亚洲无线码在线一区| 国产欧美精品在线| 欧美成人精品在线播放| 最近2019中文字幕大全第二页| 中文字幕国产精品久久| 亚洲欧美中文字幕| 亚洲人成网站在线播| 亚洲人成在线观看| 在线电影av不卡网址| 欧美又大又粗又长| 久久久精品电影| 日韩大片免费观看视频播放| 亚洲国产高清福利视频| 国模吧一区二区三区| 国产欧美一区二区白浆黑人| 欧洲精品久久久| 日本不卡高字幕在线2019| 久久成人综合视频| 国产成人亚洲精品| 国产日韩欧美电影在线观看| 国产精品18久久久久久麻辣| 久久视频这里只有精品| 91免费视频国产| 亚洲美女动态图120秒| 亚洲国产精品va在线观看黑人| 亚洲高清在线观看| 亚洲国产另类久久精品| 青草青草久热精品视频在线观看| 久久综合久久88| 久久久久久久激情视频| 欧美成人免费播放| 精品视频在线播放免| 亚洲精品日韩丝袜精品| 久久久www成人免费精品张筱雨| 欧美亚州一区二区三区| 国产日韩欧美一二三区| 日韩av免费看| 欧美性猛交丰臀xxxxx网站| 久久影院中文字幕| 亚洲欧美日韩综合| 亚洲美女性生活视频| 亚洲欧美精品suv| 日韩av电影免费观看高清| 国产精品男女猛烈高潮激情| 精品国产一区二区三区久久久狼| 亚洲三级av在线| 亚洲男人天天操| 国产综合在线视频| 久久精品电影网站| 91久久国产精品| 91av视频在线| 国外成人在线视频| 久久在线视频在线| 国产精品午夜一区二区欲梦| 久久成人亚洲精品| 久久久久久久成人| 亚洲黄色www网站| 日韩中文字幕国产| 欧美一级电影免费在线观看| 欧美制服第一页| 日韩视频免费看| 伊人男人综合视频网| 亚洲春色另类小说| 国产亚洲成av人片在线观看桃| 91国产一区在线| 自拍偷拍亚洲区| 日韩在线中文字幕| 中文字幕亚洲第一| 成人精品福利视频| 色偷偷av亚洲男人的天堂| 97色在线观看免费视频| 在线视频中文亚洲| 久久九九国产精品怡红院| 久久久国产一区| 国产成人小视频在线观看| 亚洲a在线观看| 亚洲天堂2020| 亚洲人成电影在线观看天堂色| 精品性高朝久久久久久久| 国产欧洲精品视频| 成人a视频在线观看| 伦伦影院午夜日韩欧美限制| 538国产精品视频一区二区| 欧美激情a∨在线视频播放| 91系列在线播放| 俺去啦;欧美日韩| 亚洲男人天堂手机在线| 国产专区欧美专区| 国产视频欧美视频| 欧美日韩国产在线播放| 国产精品香蕉在线观看| 亚洲一区二区三区在线视频| 国产综合在线看| 欧美在线观看网址综合| 亚洲精品久久久久久下一站| 最近2019年手机中文字幕| 18一19gay欧美视频网站| 国产精品视频白浆免费视频| 色青青草原桃花久久综合| 三级精品视频久久久久| 欧美极品少妇全裸体| 中文字幕国内精品| 日韩av在线最新| 精品亚洲国产视频|