opengl中坐标系对应关系

1:纹理坐标和顶点坐标对应关系

一般写一个opengl的render之后会写2个坐标系,一个是顶点坐标系,一个是纹理坐标系

具体坐标展示如下:

image-20230903232448645.png

顶点坐标系,一般四个顶点,V0,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
    };

一般绘制整个屏幕的时候 就绘制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
};

根据上面的对应关系,我们在写完render进行往上面绘制图像时,一般采取v0 对应T0,v1 对应T1,V2对应T2,V3对应T3 根据此种关系来进行绘制图形,即可将纹理根据刚才的对应关系贴上去

2:纹理坐标和展示窗口坐标

在A ndroid 设备中,一般左上角为原点(0,0)向右为x轴正方向,向下为 Y轴正方向,但是和上面的2个坐标系不一样,次坐标系并没有进行归一化,也就是向下和向右的正方向的做大值为屏幕实际像素大小值

image-20230903233646021.png

那为什么单独提出来此坐标系来和纹理坐标系对应,因为如果按照第一节上面说的顶点坐标和纹理坐标对应,加载出来的纹理实际因为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:旋转角度

在经过第二步的处理之后,如果是一张静态图片,此时在Android View的窗口中已经能正常展示了,但是如果是从摄像头出来的数据本身带有一定的角度的话,我们还需要对纹理进行进一步的旋转。涉及到的主要几个角度是,相机出来的图片角度,屏幕的角度,以及纹理的方向。

3.1:相机出图片角度

在不考虑前置相机需要左右的镜像,不考虑纹理贴向Android View坐标系时的上下翻转,一般相机的出图如下:

实际相机图片展示,在一般Android上 后置相机一般时 orientation为90度,前置相机为 orientation为270度

image-20230910110417561.png

3.2:相机出图的贴到纹理上

相机图片要贴到纹理上,需要我们知道纹理坐标和顶点坐标的对应关系,目前我们在opengl中创建了opengl的program 之后,相当于我们已经把画布布置好了,画布的大小不确定,有可能是 1080 *1920 大小的竖图,也有可能是 1280*720的横图,为此,opengl为了方便绘制,将最后展示的空间都归一化,也就是(-1,1)之间,所以我们在创建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
    };

因为纹理绘制时,需要把纹理的每一个点和顶点的每一个点对应上即可,也就是如第二小节中的,T0<-->V0对应,T1<-->V1对应等,但是按照这种对应方式有可能使得图片出现旋转,镜像等,因此需要我们先将图像旋转正确,就像3.1小节中orition为0的时候的展示图像。因此我们基于T0<-->V0,T1<-->V1可以得到一种对应关系,此种对应关系如果出来的图像不是正确的,我们就可以以此作为标准 将纹理进行旋转和镜像进行得到正确的展示,就会得到一下几种对应关系:

我们规定,T0,T1,T2,T3坐标分别为(0,0),(1,0),(0,1),(1,1)

标准对应关系:

//标准对应关系,此时出现的纹理有可能是镜像的,顺时针或者逆时针旋转过的
//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:我们上面的坐标在绘制基准态的坐标对应时,并没有按照V0-->T0,V1--->T1,V2--->T2,V3-->T3的标准来对应,因为纹理在往内存区域贴的时候可以以任何一个点对应顶点的点,只要顶点的绘制关系和纹理的点坐标对齐即可。我们选择的标准是 //V0<-->T2 V1<-->T3 V2<-->T0 V3<-->T1来对应的,因此基于此我们可以得到实际纹理内容的方向,然后我们在基于VERTEX -->对应TEXTURE_ROTATE_0 得到的结果进一步调整纹理,使得纹理方向贴合到屏幕上 符合人类观察视觉。在Android上一般后置摄像头旋转90度,前置旋转270度,是一般经验,但是此经验可以根据实际调整

PS2:

1:在一般常见的使用流程中,可能会有多个opengl 的program在进行串行绘制,在串行绘制的过程中,每一个opengl 的program都存在一次顶点和纹理坐标的映射关系,也就是上面VERTEX和TEXTURE_ROTATE_0的对应关系在单帧绘制中,可能存在多次对应关系。

2:每一次新的一个program绘制,先存在一个 顶点和纹理坐标的对应关系,然后把上一次的绘制结果当成一个纹理在本次的program中进行操作。

3:如果采用都往fbo对应的纹理上绘制,也就是多个program操作同一个纹理,那么每一个program都可能的对单次绘制的顶点和纹理坐标系进行操作,而进一步影响最后绘制结果

3.3:纹理图片贴到View坐标系下

    纹理显示的最后一步就是将上面纹理和顶点旋转完成之后在贴到屏幕上,在贴到屏幕上的时候是要完成一个 屏幕的View坐标系和纹理坐标系的一个转化,在上屏幕的过程只有一点注意即可,即将纹理做一次上下颠倒即可,具体可参考第二节的详细介绍
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271

推荐阅读更多精彩内容