OpenGL?Shader實現(xiàn)陰影遮罩效果
smoothstep另一種用法
在之前OpenGL Shader-抗鋸齒實現(xiàn)文章中所介紹的那樣:為了抗鋸齒效果可以用smoothstep函數(shù)對繪制形狀進行平滑過渡來實現(xiàn)。其中也提到了當(dāng)smoothstep函數(shù)中入?yún)?code>a和b范圍過大時就會出現(xiàn)漸變效果。如OpenGL Shader-抗鋸齒實現(xiàn)中所展示的效果:

遮罩效果實現(xiàn)
看到這個效果后似乎可以利用smoothstep函數(shù)中a和b入?yún)⑷〈蠓秶鷣韺崿F(xiàn)不一樣的特效能力。例如可以使用該特點來實現(xiàn)類似于老電影中遮罩效果,在視圖邊緣出現(xiàn)一層朦朧遮罩中間最亮四周有一層淡淡的陰影效果。

實現(xiàn)原理其實就是利用smoothstep函數(shù)入?yún)⑹褂么蠓秶担诶L制圓基礎(chǔ)上改造處理。底色使用白色vec3(1.),陰影遮蓋使用黑色vec3(1.)就能達到陰影遮罩效果了。
void main() {
vec2 uv = gl_FragCoord.xy / iResolution.xy;
vec4 texture = texture(iChannel2,uv);
uv -= 0.5;
uv.x *= iResolution.x/iResolution.y;
float m = 0.4;
m = smoothstep(m-0.2,m+0.2,length(uv) - 0.2);
vec3 pixel = mix(vec3(1.),vec3(0.),m);
gl_FragColor = vec4(pixel,1.0);
}
除了采用smoothstep函數(shù)實現(xiàn)外,下面還有一種方法也能實現(xiàn)陰影遮罩效果。如下glsl所示 對顏色向量vec4 texture和vignette相乘,相當(dāng)于改變色值通道亮度達到明暗對比;同時對于取值uv.y-0.5可以理解越接近中心取值越接近為0,那么計算得出的vignette就越大約接近為1。
void main() {
vec2 uv = gl_FragCoord.xy / iResolution.xy;
vec4 texture = vec4(1.);
float vigAmt = 4.0;
float vignette = (1.0-vigAmt*(uv.y-0.5)*(uv.y-0.5))*(1.0-vigAmt*(uv.x-0.5)*(uv.x-0.5));
texture *= vignette;
gl_FragColor = texture;
}
通過對照也能發(fā)現(xiàn)采用圓形公式實現(xiàn)遮罩是有一定圓弧趨勢,而另一種遮罩是偏向矩形,在特效效果上略有差異。以此類推肯定還可以根據(jù)這種方式來實現(xiàn)星型,愛心等形狀遮罩。
smoothstep


vignette


效果擴展
最后可以增加一個time時間入?yún)?,通過vigAmt值不斷變化vignette強弱來實現(xiàn)忽明忽暗的效果,會有一種在看老電影的感受。
#define time iTime
void main() {
vec2 uv = gl_FragCoord.xy / iResolution.xy;
vec4 texture = texture(iChannel2,uv);
float vigAmt = 4.0 + 0.3 * sin(time + 5.0 * cos(time*5.0));
float vignette = (1.0-vigAmt*(uv.y-0.5)*(uv.y-0.5))*(1.0-vigAmt*(uv.x-0.5)*(uv.x-0.5));
texture *= vignette;
gl_FragColor = texture;
}
到此這篇關(guān)于OpenGL Shader實現(xiàn)陰影遮罩效果的文章就介紹到這了,更多相關(guān)OpenGL Shader陰影遮罩內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺析KJFrameForAndroid框架如何高效加載Bitmap
Bitmap是Android系統(tǒng)中的圖像處理的最重要類之一。用它可以獲取圖像文件信息,進行圖像剪切、旋轉(zhuǎn)、縮放等操作,并可以指定格式保存圖像文件。本文主要是從KJFrameForAndroid框架中分析高效加載Bitmap的方法2014-07-07
Android中FoldingLayout折疊布局的用法及實戰(zhàn)全攻略
這篇文章主要介紹了Android中FoldingLayout折疊布局的用法及實例,通過FoldingLayout我們可以制作出炫酷的菜單折疊效果,文中的例子講解得非常詳細(xì),需要的朋友可以參考下2016-02-02
Android下拉列表(Spinner)效果(使用C#和Java分別實現(xiàn))
這篇文章主要介紹了Android下拉列表(Spinner)效果(使用C#和Java分別實現(xiàn)),本文直接給出效果圖和兩種語言的實現(xiàn)代碼及布局代碼,需要的朋友可以參考下2015-06-06
Android checkbox的listView(多選,全選,反選)具體實現(xiàn)方法
由于listview的一些特性,剛開始寫這種需求的功能的時候都會碰到一些問題,重點就是存儲每個checkbox的狀態(tài)值,在這里分享出了完美解決方法:2013-06-06

