zoukankan      html  css  js  c++  java
  • 清楚OpenGL代码中的列主矩阵和行主矩阵

    关于列主矩阵行主矩阵,网上的解释比较多,但是越看越迷惑。问得比较好的可以看一下这个链接,我这边尽量把这个东西弄得明明白白。

    举个例子,我们看到的translate无非就是如下两种形式:

                       (逻辑运算1)

    或者

                      (逻辑运算2)

    这里的计算跟列主矩阵和行主矩阵有关系吗?没有关系,不能说第一个是列主矩阵,第二个是行主矩阵,或者相反。可以看到一些例子translate矩阵都是第一个例子模样,但有的说系统使用行主矩阵,比如ogldev,有的说是用列主矩阵,比如songho

    那么列主矩阵和行主矩阵到底是什么?区别在哪里?列主还是行主是从glUniformMatrix*()的角度来看data的数据排列方式。一般来说是从Matrix对象中抽取连续的16个float作为数据,因此排布的关键落在Matrix的实现上,这也就是为什么Matrix的源代码往往会告诉你它是列主还是行主。以ogldev和songho的Matrix为例,他们使用的如果是逻辑运算1中的矩阵:

    • 对于ogldev的矩阵,它的存储是行存储:float m[4][4],因此传输到glUniformMatrix*()时,内存的形式是:[1, 0, 0, 1, 0, 1, 0, 2, 0, 0, 1, 3, 0, 0, 0, 1]。
    • 对于songho,他的存储是列存储:float m[16](这里构造函数按列填充它),内存的形式是:[1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 2, 3, 1]。

    在接下来在glsl读取时,由于glsl它说它是列主矩阵,也就意味着要把这16个float以列向量依次排布形式看待。因此一次用4个float来构建列向量,形成矩阵。

    如果是songho的存储排布,这时候合成的矩阵就跟逻辑矩阵一致。

    如果是ogldev的存储排布,需要通过转置(GL_TRUE)使得合成的矩阵跟逻辑矩阵一致。

    接下来再使用mat4*vec4进行相关计算。

  • 相关阅读:
    php函数
    2、Locust压力测试 实战
    mysql常用命令
    3、加强siege性能测试
    2、使用siege进行服务端性能测试
    1、siege安装
    京东云Ubuntu下安装mysql
    1、Locust压力测试环境搭建
    1、Monkey环境搭建
    Postman和Selenium IDE开局自带红蓝BUFF属性,就问你要还是不要
  • 原文地址:https://www.cnblogs.com/jizhen521/p/3396159.html
Copyright © 2011-2022 走看看