Opengl正交矩阵 glOrthof 数学原理(转)

本文介绍在OpenGL ES 2.0环境下如何手动设置3D正交矩阵以适应屏幕。通过具体函数实现及矩阵分解,阐述了正交投影原理,并展示了顶点着色器中的变换过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;

 

转载于:https://www.cnblogs.com/aminxu/p/4704200.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值