大家好,我是程序员kenney,今天给大家讲解一下Android上OpenGL开发可能会遇到的一些纹理旋转及翻转的问题,其中有些原理在其它平台上如ios,osx上也是类似的。纹理旋转的问题一定要搞清楚,不能每当碰到一个方向不对的就自己旋转一下把它转正而不去研究背后的原因,这样虽然这一步旋转正确了,但之后的处理步骤可能都是建立在错误的认知上进行的,容易错上加错。
我们先来了解一下几个坐标系
首先看下图片坐标系和纹理坐标系。图片坐标系的原点在图片左上角,x轴向右,y轴向下,x和y的取值范围都是0到对应的图片宽高。纹理坐标的原点在纹理左下角,x轴向右,y轴向上,x和y的取值范围都是0到1。把一张图片加载到纹理中,图片数据就会从图片坐标系到了纹理坐标系。
再来看看NDC坐标系和屏幕坐标系。NDC坐标系就是设备标准化坐标系,是投影变换后将坐标归一化后就转换到了NDC坐标系,它的x轴向右,y轴向上,x和y的取值范围都是-1到1,这个范围就是显示的区域,超出这个范围的都不可见,NDC坐标系这个词可能稍显陌生,其实就是通常说的顶点坐标系,但从严格意义上说还是应该叫NDC坐标系,因为顶点严格来说是世界坐标系中的,世界坐标系是三维的,NDC坐标系中的顶点其实是投影变换后将坐标归一化后得到的顶点。
屏幕坐标系x轴向右,y轴向下,x和y的取值范围都是0到对应的屏幕宽高。
在矩阵变换的最后一步变换中OpenGL会将NDC坐标系变换成屏幕坐标系然后上屏显示。
除此之后还有模型坐标系、视图坐标系等(可以参考:OpenGL ES 高级进阶:坐标系及矩阵变换),这里就不一一介绍了,因为不是讨论的重点。
另外,我们说"倒"的时候,实际上有两种倒,一种是上下倒置,一种是旋转了180度,是不一样的,要注意区别,看下图: