思路
可以觀察到靈魂出竅的效果,其實其主圖像本沒有什么變化,只是新增了一張進行縮放的紋理,跟主圖像的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幀拷貝一幀作為靈魂。
