opengl中坐標系對應關系

1:紋理坐標和頂點坐標對應關系

一般寫一個opengl的render之后會寫2個坐標系雏吭,一個是頂點坐標系,一個是紋理坐標系

具體坐標展示如下:

image-20230903232448645.png

頂點坐標系育特,一般四個頂點芋齿,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

紋理坐標一般展示如下:

image-20230903233034036.png

具體坐標長得如下:

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個坐標系不一樣,次坐標系并沒有進行歸一化暮顺,也就是向下和向右的正方向的做大值為屏幕實際像素大小值

image-20230903233646021.png

那為什么單獨提出來此坐標系來和紋理坐標系對應厅篓,因為如果按照第一節(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度

image-20230910110417561.png

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é)的詳細介紹
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末覆醇,一起剝皮案震驚了整個濱河市朵纷,隨后出現(xiàn)的幾起案子炭臭,更是在濱河造成了極大的恐慌,老刑警劉巖袍辞,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鞋仍,死亡現(xiàn)場離奇詭異,居然都是意外死亡搅吁,警方通過查閱死者的電腦和手機威创,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來谎懦,“玉大人肚豺,你說我怎么就攤上這事〗缋梗” “怎么了吸申?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長寞奸。 經(jīng)常有香客問我呛谜,道長,這世上最難降的妖魔是什么枪萄? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任隐岛,我火速辦了婚禮,結果婚禮上瓷翻,老公的妹妹穿的比我還像新娘聚凹。我一直安慰自己,他們只是感情好齐帚,可當我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布妒牙。 她就那樣靜靜地躺著,像睡著了一般对妄。 火紅的嫁衣襯著肌膚如雪湘今。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天剪菱,我揣著相機與錄音摩瞎,去河邊找鬼。 笑死孝常,一個胖子當著我的面吹牛旗们,可吹牛的內容都是我干的。 我是一名探鬼主播构灸,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼上渴,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起稠氮,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤曹阔,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后隔披,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體次兆,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年锹锰,在試婚紗的時候發(fā)現(xiàn)自己被綠了芥炭。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡恃慧,死狀恐怖园蝠,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情痢士,我是刑警寧澤彪薛,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站怠蹂,受9級特大地震影響善延,放射性物質發(fā)生泄漏。R本人自食惡果不足惜城侧,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一易遣、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧嫌佑,春花似錦豆茫、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至炮温,卻和暖如春火脉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背柒啤。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工倦挂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人白修。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓妒峦,卻偏偏與公主長得像重斑,于是被迫代替她去往敵國和親兵睛。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內容