Android OpenGL 纹理坐标原点位置

在Android平台上,OpenGl的纹理坐标原点位置在哪?你可能会从书上或者Google上看到两种不同的答案,在左下角或者左上角。

为了验证答案,我们通常会写个demo验证,贴一个简单的纹理出来看看,偷懒,这边略过demo,只列出使用的顶点与纹理坐标。

顶点坐标:

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
};

纹理坐标:

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
};

如果纹理的坐标原点在左下角,那么按照以上坐标绘制出来的结果,图像应该是正的。

结果:图像出来的效果是上下颠倒的

难道OpenGL纹理坐标原点是在左上角才对??

ok,调整一下纹理坐标,再来运行代码看看。

纹理坐标:

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
};

结果:图像出来的效果是正的了

难道OpenGL纹理坐标原点真的是在左上角??

可是书上明明写左下角,再做一个实验,将这个纹理先绘制到FBO上,然后再绘制到屏幕上(怎么将纹理绘制到FBO上,还是懒得写,文章有人看再补~~)

使用的纹理坐标还是左上角纹理坐标:

纹理坐标:

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
};

结果:图像又上下颠倒了

这是为啥?是因为绘制到FBO上会产生颠倒的效果吗??

为了验证这个,改成使用左下角的纹理坐标:

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
};

结果:图像出来的效果是正的了

所以,绘制到FBO上,并不会产生上下颠倒的效果。

后来,又陆续对比了绘制相机出来的纹理、MediaPlayer出来的纹理等多种场景,最终得出的结论:

1、OpenGL纹理的原点是左下角

2、在Android平台中,Bitmap绑定的2D纹理,是上下颠倒的, 可以按照在左上角处理

这也就解释了为什么有的文章介绍的纹理坐标是左上角为原点,这类文章一般都是在绘制Bitmap绑定的纹理。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。