OpenGL Shader實現(xiàn)物件材料效果詳解
需求背景
在一些主流app上有一些比較特殊的濾鏡效果,例如灰塵、塑料封面、光影效果等。在此之前一直困惑這類濾鏡效果是如何實現(xiàn)的,單純glsl腳本來繪制難度似乎有點大。例如下面截取平臺的幾種效果像是在圖片上方覆蓋了一個透明圖層。



需求實現(xiàn)
glsl腳本實現(xiàn)其實特別簡單,加載兩個紋理同時對兩個紋理的rgb進(jìn)行相加即可。
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疊加即可呈現(xiàn)出最終希望達(dá)到的效果。這樣的效果似乎比通過腳本模擬更加簡易,同時也降低了開發(fā)成本。
功能拓展
另外對于素材和圖片尺寸的問題是可以通過腳本代碼來處理完成。對uv1和uv2進(jìn)行比例相乘計算處理即可實現(xiàn)圖片尺寸縮放操作,此外再通過smoothstep方法和算法控制紋理顯示區(qū)域大小實現(xiàn)了框中圖的效果。
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);
}
此外還能對素材圖片進(jìn)行替換,從而達(dá)到不同效果場景氛圍。


高級實現(xiàn)
但不一定所有效果都需要借助于設(shè)計師素材來實現(xiàn),高級玩法其實是可以通過腳本直接實現(xiàn)。例如下面光照效果實際上就是只通過代碼模擬來完成的,沒有增加外置任何其他素材資源。但是實現(xiàn)成本較高需要了解很多數(shù)學(xué)模擬公式以及技術(shù)背景,而且最終效果也不一定是產(chǎn)品和設(shè)計所能滿意的。

PS:具體實現(xiàn)是從shaderToy上找到,這里就不分享具體代碼了。
結(jié)果總結(jié)
有感而發(fā)在需求實現(xiàn)上原先因為設(shè)計希望實現(xiàn)彩虹、光照、物件等在原圖之上的濾鏡效果,在此調(diào)研之前一直覺得技術(shù)是可以完成所有任務(wù)的。最終通過實踐才發(fā)現(xiàn)有時候一些捷徑實現(xiàn)和更直接簡單的方法或許是最終最優(yōu)解。所以技術(shù)和設(shè)計還是息息相關(guān),在時間和精力有限的情況下應(yīng)該借助其他方式快速達(dá)成需求目標(biāo)。
到此這篇關(guān)于OpenGL Shader實現(xiàn)物件材料效果詳解的文章就介紹到這了,更多相關(guān)OpenGL Shader物件材料效果內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android藍(lán)牙服務(wù)查找附近設(shè)備分析探索
這篇文章主要介紹了Android藍(lán)牙服務(wù)實現(xiàn)查找附近設(shè)備,了解內(nèi)部原理是為了幫助我們做擴展,同時也是驗證了一個人的學(xué)習(xí)能力,如果你想讓自己的職業(yè)道路更上一層樓,這些底層的東西你是必須要會的2023-01-01
Android攔截并獲取WebView內(nèi)部POST請求參數(shù)的實現(xiàn)方法
這篇文章主要介紹了Android攔截并獲取WebView內(nèi)部POST請求參數(shù) 的實現(xiàn)方法,本文通過兩種方案給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2019-04-04
Android解決ScrollView下嵌套ListView和GridView中內(nèi)容顯示不全的問題
今天小編就為大家分享一篇關(guān)于Android解決ScrollView下嵌套ListView和GridView中內(nèi)容顯示不全的問題,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-12-12
Android給TextView添加點擊事件的實現(xiàn)方法
下面小編就為大家?guī)硪黄狝ndroid給TextView添加點擊事件的實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-12-12
Android自定義view實現(xiàn)電影票在線選座功能
這篇文章主要為大家詳細(xì)介紹了Android自定義view實現(xiàn)選座功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-11-11
android自定義toast(widget開發(fā))示例
這篇文章主要介紹了android自定義toast(widget開發(fā))示例,需要的朋友可以參考下2014-03-03
Ubuntu中為Android增加硬件抽象層(HAL)模塊訪問Linux內(nèi)核驅(qū)動程序
本文主要介紹在Ubuntu上為Android HAL模塊訪問Linux內(nèi)核驅(qū)動程序,這里給大家提供方法和一個小的測試程序代碼,以及常遇到的問題和解決方法,有需要的小伙伴可以參考下2016-08-08

