在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绑定的纹理。