Android OpenGLES濾鏡開發(fā)之仿抖音靈魂出竅

思路

可以觀察到靈魂出竅的效果,其實其主圖像本沒有什么變化,只是新增了一張進行縮放的紋理,跟主圖像的alpha進行線性融合的。

怎么去取靈魂呢,靈魂是跟著視頻所播放的內(nèi)容不斷更新的,不可能一直只是同一個圖像。所以這里的思路是每X幀拷貝一幀作為靈魂,然后將靈魂按比例放大,最后將靈魂與主圖像進行混合。

實現(xiàn)

片元著色器

因為視頻錄制出來的是YUV格式的數(shù)據(jù),但是在OpenGL中是需要的RGB顏色,所以需要將YUV格式的數(shù)據(jù)轉(zhuǎn)化成RGB格式的,這里需要將YUV格式的數(shù)據(jù)進行分離之后,再轉(zhuǎn)換。轉(zhuǎn)換是有公式的,用公式進行計算就好啦。


渲染主圖像

首先就是獲取索引,然后創(chuàng)建Y、U、V三個紋理,分別進行傳值,然后先畫主圖像,不進行任何的縮放平移。


上面代碼就是首先將主圖像的YUV數(shù)據(jù)進行分離,分離YUV就不介紹了,比較簡單,然后設(shè)置setIdentityM設(shè)置一個單位矩陣,這個矩陣是沒有任何縮放平移效果的。這個方法的源碼是


這個矩陣需要個傳入的4個頂點坐標(biāo)進行運算,為什么這樣的單位矩陣就是沒有任何效果的呢,可以來進行矩陣運算一下,輸入頂點坐標(biāo)為(1,1,0,0)的話,與矩陣運算之后的結(jié)果還是(1,1,0,0)


設(shè)置完需要的矩陣,YUV三個紋理,就需要將這些頂點,YUV紋理傳遞給著色器就可以了。這個里就看一下Y數(shù)據(jù)的傳遞,UV數(shù)據(jù)傳遞也是一樣的。



渲染靈魂

因為靈魂出竅這個效果,靈魂是不斷的更新放大,所以我們這里是采用了間隔X幀拷貝一幀作為靈魂。


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容