在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
结果:图像出来的效果是正的了