在Android平臺(tái)上经窖,OpenGl的紋理坐標(biāo)原點(diǎn)位置在哪募谎?你可能會(huì)從書上或者Google上看到兩種不同的答案拜银,在左下角或者左上角殊鞭。
為了驗(yàn)證答案遭垛,我們通常會(huì)寫個(gè)demo驗(yàn)證,貼一個(gè)簡(jiǎn)單的紋理出來看看操灿,偷懶锯仪,這邊略過demo,只列出使用的頂點(diǎn)與紋理坐標(biāo)趾盐。
頂點(diǎn)坐標(biāo):
public static final float RECTANGLE_COORDS[] = {
-1, -1, // 0 bottom left
1, -1, // 1 bottom right
-1, 1, // 2 top left
1, 1, // 3 top right
};
紋理坐標(biāo):
public static final float RECTANGLE_2D_TEX_COORDS[] = {
0, 0, // 0 bottom left
1, 0, // 1 bottom right
0, 1, // 2 top left
1, 1 // 3 top right
};
如果紋理的坐標(biāo)原點(diǎn)在左下角庶喜,那么按照以上坐標(biāo)繪制出來的結(jié)果,圖像應(yīng)該是正的救鲤。
結(jié)果:圖像出來的效果是上下顛倒的
難道OpenGL紋理坐標(biāo)原點(diǎn)是在左上角才對(duì)久窟??
ok本缠,調(diào)整一下紋理坐標(biāo)斥扛,再來運(yùn)行代碼看看。
紋理坐標(biāo):
public static final float RECTANGLE_2D_TEX_COORDS[] = {
0, 1, // 0 bottom left
1, 1, // 1 bottom right
0, 0, // 2 top left
1, 0 // 3 top right
};
結(jié)果:圖像出來的效果是正的了
難道OpenGL紋理坐標(biāo)原點(diǎn)真的是在左上角丹锹?稀颁?
可是書上明明寫左下角,再做一個(gè)實(shí)驗(yàn)卷仑,將這個(gè)紋理先繪制到FBO上峻村,然后再繪制到屏幕上(怎么將紋理繪制到FBO上,還是懶得寫锡凝,文章有人看再補(bǔ)~~)
使用的紋理坐標(biāo)還是左上角紋理坐標(biāo):
紋理坐標(biāo):
public static final float RECTANGLE_2D_TEX_COORDS[] = {
0, 1, // 0 bottom left
1, 1, // 1 bottom right
0, 0, // 2 top left
1, 0 // 3 top right
};
結(jié)果:圖像又上下顛倒了
這是為啥粘昨?是因?yàn)槔L制到FBO上會(huì)產(chǎn)生顛倒的效果嗎?窜锯?
為了驗(yàn)證這個(gè)张肾,改成使用左下角的紋理坐標(biāo):
public static final float RECTANGLE_2D_TEX_COORDS[] = {
0, 1, // 0 bottom left
1, 1, // 1 bottom right
0, 0, // 2 top left
1, 0 // 3 top right
};
結(jié)果:圖像出來的效果是正的了
所以,繪制到FBO上锚扎,并不會(huì)產(chǎn)生上下顛倒的效果吞瞪。
后來,又陸續(xù)對(duì)比了繪制相機(jī)出來的紋理驾孔、MediaPlayer出來的紋理等多種場(chǎng)景芍秆,最終得出的結(jié)論:
1、OpenGL紋理的原點(diǎn)是左下角
2翠勉、在Android平臺(tái)中妖啥,Bitmap綁定的2D紋理,是上下顛倒的对碌, 可以按照在左上角處理
這也就解釋了為什么有的文章介紹的紋理坐標(biāo)是左上角為原點(diǎn)荆虱,這類文章一般都是在繪制Bitmap綁定的紋理。