1:紋理坐標和頂點坐標對應關系
一般寫一個opengl的render之后會寫2個坐標系雏吭,一個是頂點坐標系,一個是紋理坐標系
具體坐標展示如下:
頂點坐標系育特,一般四個頂點芋齿,V0镇防,V1,V2偷办,V3兼吓,四個點對應成數(shù)組為
public final static float[] VERTEX = {
-1.0f, -1.0f,//V0
1.0f, -1.0f,//V1
-1.0f, 1.0f,//V2
1.0f, 1.0f //V3
};
一般繪制整個屏幕的時候 就繪制2個三角形,2個三角形的2個頂點組成分別為 v0卿捎,v1,v2 和 v1配紫,v2,v3
紋理坐標一般展示如下:
具體坐標長得如下:
public final static float[] TEXTURE_ROTATE_0 = {
0.0f, 0.0f,//T0
1.0f, 0.0f,//T1
0.0f, 1.0f,//T2
1.0f, 1.0f//T3
};
根據(jù)上面的對應關系,我們在寫完render進行往上面繪制圖像時午阵,一般采取v0 對應T0躺孝,v1 對應T1,V2對應T2底桂,V3對應T3 根據(jù)此種關系來進行繪制圖形植袍,即可將紋理根據(jù)剛才的對應關系貼上去
2:紋理坐標和展示窗口坐標
在A ndroid 設備中,一般左上角為原點(0,0)向右為x軸正方向籽懦,向下為 Y軸正方向于个,但是和上面的2個坐標系不一樣,次坐標系并沒有進行歸一化暮顺,也就是向下和向右的正方向的做大值為屏幕實際像素大小值
那為什么單獨提出來此坐標系來和紋理坐標系對應厅篓,因為如果按照第一節(jié)上面說的頂點坐標和紋理坐標對應秀存,加載出來的紋理實際因為Android View坐標系的原因是上下顛倒的,因此需要我們在使用紋理坐標系時羽氮,對紋理先進性第一步處理或链,即上下顛倒一次。
上下顛倒如何理解档押?即T0點和T2點互換位置澳盐,T3和T1互換位置
上下顛倒完成一次之后的 頂點坐標和紋理坐標對應關系如下:
//上下顛倒過的頂點坐標和紋理坐標對應關系
public final static float[] VERTEX = {
-1.0f, -1.0f,//V0
1.0f, -1.0f,//V1
-1.0f, 1.0f,//V2
1.0f, 1.0f //V3
};
public final static float[] TEXTURE_ROTATE_0 = {
0.0f, 1.0f,//新T0 原來的T2
1.0f, 1.0f,//新T1 原來的T3
0.0f, 0.0f,//新T2 原來的T0
1.0f, 0.0f //新T3 原來的T1
};
3:旋轉角度
在經(jīng)過第二步的處理之后,如果是一張靜態(tài)圖片汇荐,此時在Android View的窗口中已經(jīng)能正常展示了洞就,但是如果是從攝像頭出來的數(shù)據(jù)本身帶有一定的角度的話,我們還需要對紋理進行進一步的旋轉掀淘。涉及到的主要幾個角度是旬蟋,相機出來的圖片角度,屏幕的角度革娄,以及紋理的方向倾贰。
3.1:相機出圖片角度
在不考慮前置相機需要左右的鏡像,不考慮紋理貼向Android View坐標系時的上下翻轉拦惋,一般相機的出圖如下:
實際相機圖片展示匆浙,在一般Android上 后置相機一般時 orientation為90度,前置相機為 orientation為270度
3.2:相機出圖的貼到紋理上
相機圖片要貼到紋理上厕妖,需要我們知道紋理坐標和頂點坐標的對應關系首尼,目前我們在opengl中創(chuàng)建了opengl的program 之后,相當于我們已經(jīng)把畫布布置好了言秸,畫布的大小不確定软能,有可能是 1080 *1920 大小的豎圖,也有可能是 1280*720的橫圖举畸,為此查排,opengl為了方便繪制,將最后展示的空間都歸一化抄沮,也就是(-1,1)之間跋核,所以我們在創(chuàng)建oepngl的program時,傳入的頂點坐標就是
public final static float[] VERTEX = {
-1.0f, -1.0f,//V0
1.0f, -1.0f,//V1
-1.0f, 1.0f,//V2
1.0f, 1.0f //V3
};
因為紋理繪制時叛买,需要把紋理的每一個點和頂點的每一個點對應上即可砂代,也就是如第二小節(jié)中的,T0<-->V0對應率挣,T1<-->V1對應等泊藕,但是按照這種對應方式有可能使得圖片出現(xiàn)旋轉,鏡像等,因此需要我們先將圖像旋轉正確娃圆,就像3.1小節(jié)中orition為0的時候的展示圖像玫锋。因此我們基于T0<-->V0,T1<-->V1可以得到一種對應關系讼呢,此種對應關系如果出來的圖像不是正確的撩鹿,我們就可以以此作為標準 將紋理進行旋轉和鏡像進行得到正確的展示,就會得到一下幾種對應關系:
我們規(guī)定悦屏,T0,T1,T2,T3坐標分別為(0,0),(1,0)节沦,(0,1),(1,1)
標準對應關系:
//標準對應關系础爬,此時出現(xiàn)的紋理有可能是鏡像的甫贯,順時針或者逆時針旋轉過的
//V0<-->T2
//V1<-->T3
//V2<-->T0
//V3<-->T1
public final static float[] VERTEX = {
-1.0f, -1.0f,//V0
1.0f, -1.0f,//V1
-1.0f, 1.0f,//V2
1.0f, 1.0f //V3
};
public final static float[] TEXTURE_ROTATE_0 = {
0.0f, 1.0f,//T2
1.0f, 1.0f,//T3
0.0f, 0.0f,//T0
1.0f, 0.0f//T1
};
順時針旋轉90度
//頂點繪制順序 v0 v1 v2 ,v1,v2,v3
public final static float[] VERTEX = {
-1.0f, -1.0f,//V0
1.0f, -1.0f,//V1
-1.0f, 1.0f,//V2
1.0f, 1.0f //V3
};
//V0<-->T3
//V1<-->T1
//V2<-->T2
//V3<-->T0
public final static float[] TEXTURE_ROTATE_90 = {
1.0f, 1.0f,//T3
1.0f, 0.0f,//T1
0.0f, 1.0f,//T2
0.0f, 0.0f //T0
};
順時針旋轉180度
//頂點繪制順序 v0 v1 v2 ,v1,v2,v3
public final static float[] VERTEX = {
-1.0f, -1.0f,//V0
1.0f, -1.0f,//V1
-1.0f, 1.0f,//V2
1.0f, 1.0f //V3
};
//V0<-->T1
//V1<-->T0
//V2<-->T3
//V3<-->T2
public final static float[] TEXTURE_ROTATE_180 = {
1.0f, 0.0f,//T1
0.0f, 0.0f,//T0
1.0f, 1.0f,//T3
0.0f, 1.0f//T2
};
順時針旋轉270度
//頂點繪制順序 v0 v1 v2 ,v1,v2,v3
public final static float[] VERTEX = {
-1.0f, -1.0f,//V0
1.0f, -1.0f,//V1
-1.0f, 1.0f,//V2
1.0f, 1.0f //V3
};
//V0<-->T0
//V1<-->T2
//V2<-->T1
//V3<-->T3
public final static float[] TEXTURE_ROTATE_270 = {
0.0f, 0.0f,//T0
0.0f, 1.0f,//T2
1.0f, 0.0f,//T1
1.0f, 1.0f//T3
};
PS:我們上面的坐標在繪制基準態(tài)的坐標對應時,并沒有按照V0-->T0,V1--->T1,V2--->T2,V3-->T3的標準來對應看蚜,因為紋理在往內存區(qū)域貼的時候可以以任何一個點對應頂點的點叫搁,只要頂點的繪制關系和紋理的點坐標對齊即可。我們選擇的標準是 //V0<-->T2 V1<-->T3 V2<-->T0 V3<-->T1來對應的供炎,因此基于此我們可以得到實際紋理內容的方向渴逻,然后我們在基于VERTEX -->對應TEXTURE_ROTATE_0 得到的結果進一步調整紋理,使得紋理方向貼合到屏幕上 符合人類觀察視覺音诫。在Android上一般后置攝像頭旋轉90度惨奕,前置旋轉270度,是一般經(jīng)驗竭钝,但是此經(jīng)驗可以根據(jù)實際調整
PS2:
1:在一般常見的使用流程中梨撞,可能會有多個opengl 的program在進行串行繪制,在串行繪制的過程中香罐,每一個opengl 的program都存在一次頂點和紋理坐標的映射關系卧波,也就是上面VERTEX和TEXTURE_ROTATE_0的對應關系在單幀繪制中,可能存在多次對應關系穴吹。
2:每一次新的一個program繪制幽勒,先存在一個 頂點和紋理坐標的對應關系嗜侮,然后把上一次的繪制結果當成一個紋理在本次的program中進行操作港令。
3:如果采用都往fbo對應的紋理上繪制,也就是多個program操作同一個紋理锈颗,那么每一個program都可能的對單次繪制的頂點和紋理坐標系進行操作顷霹,而進一步影響最后繪制結果
3.3:紋理圖片貼到View坐標系下
紋理顯示的最后一步就是將上面紋理和頂點旋轉完成之后在貼到屏幕上,在貼到屏幕上的時候是要完成一個 屏幕的View坐標系和紋理坐標系的一個轉化击吱,在上屏幕的過程只有一點注意即可淋淀,即將紋理做一次上下顛倒即可,具體可參考第二節(jié)的詳細介紹