OpenGL Shader實現物件材料效果詳解
需求背景
在一些主流app上有一些比較特殊的濾鏡效果,例如灰塵、塑料封面、光影效果等。在此之前一直困惑這類濾鏡效果是如何實現的,單純glsl
腳本來繪制難度似乎有點大。例如下面截取平臺的幾種效果像是在圖片上方覆蓋瞭一個透明圖層。
需求實現
glsl
腳本實現其實特別簡單,加載兩個紋理同時對兩個紋理的rgb進行相加即可。
void main() { vec2 uv = gl_FragCoord.xy / iResolution.xy; vec4 texture1 = texture(iChannel1,uv); vec4 texture2 = texture(iChannel2,uv); vec3 rgb = texture1.rgb + texture2.rgb; vec4 pixel = vec4(rgb,1.); gl_FragColor = pixel; }
紋理1
紋理2
紋理3
紋理2是一個透明塑封封面,兩者rgb
疊加即可呈現出最終希望達到的效果。這樣的效果似乎比通過腳本模擬更加簡易,同時也降低瞭開發成本。
功能拓展
另外對於素材和圖片尺寸的問題是可以通過腳本代碼來處理完成。對uv1和uv2進行比例相乘計算處理即可實現圖片尺寸縮放操作,此外再通過smoothstep
方法和算法控制紋理顯示區域大小實現瞭框中圖的效果。
void main() { vec2 uv1 = gl_FragCoord.xy / iResolution.xy; uv1.y = mod(uv1.y, 1.0); vec2 uv2 = uv1; uv1 -= 0.5; uv1 *= 2.; uv1 += 0.5; uv2 -= 0.5; uv2 *= 1.5; uv2 += 0.5; float l = 0.003; float k = smoothstep((1.0 - l), (1.0 - l) + 0.006, uv1.x); float k1 = smoothstep(l, l - 0.006, uv1.x); float m = smoothstep((1.0 - l), (1.0 - l) + 0.006, uv1.y); float m1 = smoothstep(l, l - 0.006, uv1.y); float i = smoothstep((1.0 - l), (1.0 - l) + 0.006, uv2.x); float i1 = smoothstep(l, l - 0.006, uv2.x); float j = smoothstep((1.0 - l), (1.0 - l) + 0.006, uv2.y); float j1 = smoothstep(l, l - 0.006, uv2.y); vec4 texture1 = texture(iChannel1, uv1)* (1.0 - k) * (1.0 - k1) * (1.0 - m) * (1.0 - m1); vec4 texture2 = texture(iChannel3, vec2(uv2.x,uv2.y)) * (1.0 - i) * (1.0 - i1) * (1.0 - j) * (1.0 - j1); gl_FragColor = 1.0 - (1.0 - texture1) * (1.0 - texture2); }
此外還能對素材圖片進行替換,從而達到不同效果場景氛圍。
高級實現
但不一定所有效果都需要借助於設計師素材來實現,高級玩法其實是可以通過腳本直接實現。例如下面光照效果實際上就是隻通過代碼模擬來完成的,沒有增加外置任何其他素材資源。但是實現成本較高需要瞭解很多數學模擬公式以及技術背景,而且最終效果也不一定是產品和設計所能滿意的。
PS:具體實現是從shaderToy上找到,這裡就不分享具體代碼瞭。
結果總結
有感而發在需求實現上原先因為設計希望實現彩虹、光照、物件等在原圖之上的濾鏡效果,在此調研之前一直覺得技術是可以完成所有任務的。最終通過實踐才發現有時候一些捷徑實現和更直接簡單的方法或許是最終最優解。所以技術和設計還是息息相關,在時間和精力有限的情況下應該借助其他方式快速達成需求目標。
到此這篇關於OpenGL Shader實現物件材料效果詳解的文章就介紹到這瞭,更多相關OpenGL Shader物件材料效果內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- OpenGL Shader實現陰影遮罩效果
- 詳解OpenGL Shader抗鋸齒的實現
- OpenGL Shader實現簡單轉場效果詳解
- 詳解OpenGL Shader彩虹條紋效果的實現
- OpenGL Shader實現光照發光體特效