在利用非固定管线进行纹理渲染的时候,经常要用到纹理和顶点坐标的映射关系,这里从三维角度介绍下二维的纹理坐标映射:

顶点坐标:

java opengl 提供顶点坐标与面信息 opengl顶点坐标纹理坐标关系_纹理映射

首先得明确:

  • 顶点坐标是在世界坐标系上(可参考:从渲染过程来理解opengl坐标系和坐标变换投影),这里的世界坐标系投影的屏幕坐标系(可参考:从渲染过程来理解opengl坐标系和坐标变换投影)上,
  • x、y如上图所示,z正方向是从屏幕向外,人眼的位置则是在原点(0,0,0),因此只要固定z为-1或者0, 然后绘制一个如上图坐标的四边形,后续就是将纹理贴在这个四边形上。

sampler2D纹理坐标

java opengl 提供顶点坐标与面信息 opengl顶点坐标纹理坐标关系_世界坐标系_02

纹理的生成是由图片像素来生成的,而图像的存储是从左上角开始的,对应于上图,就是图像左上角像素生成的纹理部分就在纹理左下角处,即 上下颠倒。

映射

为了能够让图像正确的显示,就必须将生成纹理的对应点再颠倒一次,负负得正,哈哈。

java opengl 提供顶点坐标与面信息 opengl顶点坐标纹理坐标关系_纹理映射_03

 

最终,在写顶点坐标 和 纹理映射坐标的时候,就直接将 顶点坐标的矩形 于 上图 右边图 对应位置 对应起来即可。

//    //顶点坐标
    public float pos[] = {
            -1.0f,  1.0f,
            -1.0f, -1.0f,
            1.0f, 1.0f,
            1.0f,  -1.0f,
    };


    public float coor[] = {
            0.0f , 0.0f,
            0.0f , 1.0f,
            1.0f , 0.0f,
            1.0f , 1.0f
    };

为了正确的渲染我们的纹理,因此在映射的时候,将顶点坐标的左上角,对应在纹理坐标的左下角,即 左上对左下,右上对右下,,这样纹理就可以 正确的渲染出来。

当然也可以通过,对其后的纹理进行旋转,如左上对左下,右上对右下 后再将对应好的纹理映射坐标旋转 90 度(下面一节samplerExternalOES的纹理映射会讲解到这种方法),就可以实现纹理的旋转90度了。当然旋转还可以利用矩阵来实现。