zoukankan      html  css  js  c++  java
  • Opengl正交矩阵 glOrthof 数学原理(转)

    http://blog.sina.com.cn/s/blog_6084f588010192ug.html

    在opengles1.1中设置正交矩阵只要一个函数调用就可以了:glOrthof,但是opengles2.0开始,为了增加渲染灵活性摆脱了固定管道渲染,这样就需要手动去实现glOrthof所对应的矩阵。

    在iphone3D 编程一书中给出了这个矩阵的定义:

    void RenderingEngine2::ApplyOrtho(float maxX, float maxY) const

    {

        float a = 1.0f / maxX;

        float b = 1.0f / maxY;

        float ortho[16] = {

            a, 0,  0, 0,

            0, b,  0, 0,

            0, 0, -1, 0,

            0, 0,  0, 1

        };

       

        GLintprojectionUniform = glGetUniformLocation(m_simpleProgram, "Projection");

        glUniformMatrix4fv(projectionUniform, 1, 0, &ortho[0]);

    }

    这个函数用于将3d正交矩阵投影到xy平面,也就是转换到二维平面,也就是需要舍掉一个纬度。这里需要舍掉z轴,也就是z轴为零。

    对矩阵分解成四个向量

      float ortho[16] = {

            a, 0,  0, 0,

            0, b,  0, 0,

            0, 0, -1, 0,

            0, 0,  0, 1

    };

    Ix(a,0,0,0),  Iy(0,b,0,0) , Iz(0,0,-1,0)  ,   Iw(0,0,0,1)

    正常情况投影到xy平面z向量应该为零,这里他设置成了-1,有点不解,难道说是说z方向上的裁减范围,有待进一步研究。对于w了向量,是为了计算方便,可以不考虑。

        float a = 1.0f / maxX;

        float b = 1.0f / maxY;

    对于a,b因为最终的向量要进行缩放以适应屏幕,所以这里是对x,y进行缩放的因子(把屏幕宽高理解为一个单位就好理解了)。

    再来看一下对应的顶点着色器文件

    const char* SimpleVertexShader = STRINGIFY(

     

    attribute vec4 Position;

    attribute vec4 SourceColor;

    varying vec4DestinationColor;

    uniform mat4 Projection;

    uniform mat4 Modelview;

     

    void main(void)

    {

        DestinationColor = SourceColor;

        gl_Position = Projection * Modelview * Position;

    }

    );

    这一行正是对映射到屏幕上点的最终变换

    gl_Position = Projection * Modelview * Position;

  • 相关阅读:
    组合数
    POJ2774 Long Long Message
    后缀排序【后缀数组入门题】
    luogu P3205 [HNOI2010]合唱队 区间dp
    luogu P3119 [USACO15JAN]Grass Cownoisseur G 有向图强连通分量+分层最短路
    luogu P3469 [POI2008]BLO-Blockade 割点
    luogu P2569 [SCOI2010]股票交易 单调优化dp
    luogu P2939 [USACO09FEB]Revamping Trails G 分层最短路
    luogu P3957 跳房子 二分+斜率优化dp
    luogu P1772 [ZJOI2006]物流运输 spfa最短路+dp
  • 原文地址:https://www.cnblogs.com/aminxu/p/4704200.html
Copyright © 2011-2022 走看看