您好,登錄后才能下訂單哦!
小編給大家分享一下OpenGL Shader如何實現陰影遮罩效果,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
在之前OpenGL Shader-抗鋸齒實現文章中所介紹的那樣:為了抗鋸齒效果可以用smoothstep
函數對繪制形狀進行平滑過渡來實現。其中也提到了當smoothstep
函數中入參a
和b
范圍過大時就會出現漸變效果。如OpenGL Shader-抗鋸齒實現中所展示的效果:
看到這個效果后似乎可以利用smoothstep
函數中a
和b
入參取大范圍來實現不一樣的特效能力。例如可以使用該特點來實現類似于老電影中遮罩效果,在視圖邊緣出現一層朦朧遮罩中間最亮四周有一層淡淡的陰影效果。
實現原理其實就是利用smoothstep
函數入參使用大范圍值,在繪制圓基礎上改造處理。底色使用白色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
函數實現外,下面還有一種方法也能實現陰影遮罩效果。如下glsl
所示 對顏色向量vec4 texture
和vignette
相乘,相當于改變色值通道亮度達到明暗對比;同時對于取值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; }
通過對照也能發現采用圓形公式實現遮罩是有一定圓弧趨勢,而另一種遮罩是偏向矩形,在特效效果上略有差異。以此類推肯定還可以根據這種方式來實現星型,愛心等形狀遮罩。
smoothstep
vignette
最后可以增加一個time
時間入參,通過vigAmt
值不斷變化vignette
強弱來實現忽明忽暗的效果,會有一種在看老電影的感受。
#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; }
以上是“OpenGL Shader如何實現陰影遮罩效果”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。