代码中使用列主元还是行主元?当然都可以。如果是行主元,在void glUniformMatrix4x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);中transpose是GL_TRUE。无论是行主元还是列主元,在glUniformMatrix4fv的作用下,都统一为列主元,因此着色器代码是相同的。读法是先读列再读行,比如glUniformMatrix2x4fv的意思是要传入一个2列4行的矩阵。

经常会遇到例子代码的主元和自己工程的主元不一致的情况,如何进行调整?

举个例子:Assimp里对矩阵的读取的aiMatrix4x4t矩阵是行主元的,要读进(列主元的)glm::mat4中,需要做一个transpose转置操作,将行主元变为列主元。

如果例子代码里有的:aiMatrix4x4t mx = m1 * m2 * m3;//m1, m2, m3都为行向量,那么在glm的环境下应该怎么做呢:

m1 = glm::transpose(m1);

m2 = glm::transpose(m2);

m3 = glm::transpose(m3);

glm::mat4 mx = m1 * m2 * m3;//为什么不是m3 * m2 * m1?不是(A*B)T=(B)T * (A)T吗?

因为在glm中,m1 * m2的计算是拿m1的第i列与m2的第j行相乘,并不是像行矩阵里的规则m1的第i行和m2的第j列相乘。下面是矩阵的等价运算规则。GL_FALSE是指的glUniformMatrix4x4fv的transpose参数。你们可以使用1*2和2*3的矩阵测试一下,比较清晰。

项之间的乘积 m1,m2为行主矩阵 (m1)T,(m2)T为列主矩阵
左边的i行x右边的j列 m1*m2,GL_TRUE (m2)T*(m1)T,GL_FALSE
左边的i列x右边的j行

m2*m1,GL_TRUE 

(m1)T*(m2)T,GL_FALSE

注意:存储都是以行进行存储的。这里不是说用行依次存储每一列,而是用行存储每一列的相应行的项。比如一个列主元矩阵是由4个列向量构成(a11, a12, a13, a13), (a21, a22, a23 ,a24), (a31, a32, a33, a34), (a41, a42, a43, a44),那么存储的时候是以数组(a11, a21, a31, a41), (a12, a22, a32, a42), (a13, a23, a33, a43), (a14, a24, a34, a44)存储,通过glUniformMatrix4fv传递的数据序列为(a11, a21, a31, a41, a12, a22, a32, a42, a13, a23, a33, a43, a14, a24, a34, a44),在传递到shader时,还原为列向量形式,然后与顶点等进行乘积。在instance效果中,将matrxi的每一行作为顶点属性,在shader中依然还原为列向量的矩阵。顶点向量被认为是行向量。

OpenGL列主元矩阵的运算的更多相关文章

  1. OpenGL列主元矩阵和列主序存储

    OpenGL矩阵要考虑两个点,一个是向量如何排布,一个是矩阵如何存储和恢复. 1.排布 排布决定了运算的顺序.OpenGL使用的是列主元,它的意思就是一个4X4的矩阵是由4个列向量构成(这里的v1,v ...

  2. ogre, dx, opengl坐标矩阵

    opengl 右手坐标系 列向量 左乘 列主序存储矩阵osg   右手坐标系 行向量 右乘 行主序存储矩阵d3d       左手坐标系 行向量 右乘 行主序存储矩阵ogre    右手坐标系 列向量 ...

  3. Opengl中矩阵和perspective/ortho的相互转换

    Opengl中矩阵和perspective/ortho的相互转换 定义矩阵 Opengl变换需要用四维矩阵.我们来定义这样的矩阵. +BIT祝威+悄悄在此留下版了个权的信息说: 四维向量 首先,我们定 ...

  4. OpenGL投影矩阵

    概述 透视投影 正交投影 概述 计算机显示器是一个2D平面.OpenGL渲染的3D场景必须以2D图像方式投影到计算机屏幕上.GL_PROJECTION矩阵用于该投影变换.首先,它将所有定点数据从观察坐 ...

  5. C#的winform矩阵简单运算

    C#的winform矩阵简单运算 程序截图 关键代码 using System; using System.Collections.Generic; using System.ComponentMod ...

  6. HDU 2276 Kiki & Little Kiki 2(矩阵位运算)

    Kiki & Little Kiki 2 转载自:点这里 [题目链接]Kiki & Little Kiki 2 [题目类型]矩阵位运算 &题意: 一排灯,开关状态已知,每过一秒 ...

  7. OpenGL投影矩阵【转】

    OpenGL投影矩阵 概述 透视投影 正交投影 概述 计算机显示器是一个2D平面.OpenGL渲染的3D场景必须以2D图像方式投影到计算机屏幕上.GL_PROJECTION矩阵用于该投影变换.首先,它 ...

  8. 斐波那契数列F(n)【n超大时的(矩阵加速运算) 模板】

    hihocoder #1143 : 骨牌覆盖问题·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 骨牌,一种古老的玩具.今天我们要研究的是骨牌的覆盖问题: 我们有一个 ...

  9. OpenGL的矩阵使用——绘制桌子

    其中最左边的桌子循环上移(即匀速上移到一定位置后回到原点继续匀速上移),中间的桌子不断旋转(即绕自身中间轴旋转),最右边的桌子循环缩小(即不断缩小到一定大小后回归原来大小继续缩小). 桌子的模型尺寸如 ...

随机推荐

  1. Route Filters

    Route Filters The Controller's Middleware, represents a High-Level processing API, executed by the r ...

  2. Upgrading Applications

    Upgrading Applications If you have an existing Zend Framework v2 application, and want to update it ...

  3. failed to obtain a cell from its dataSource

    stroyboard没有绑定标示 没有注册标示 cell为空时没有创建

  4. About Webkit

    http://blog.csdn.net/spacetiller/article/details/5784461 一 . WebKit 简介 Webkit 是一个开放源代码的浏览器引擎 (web br ...

  5. visibility,display区别

    visibility:hidden,display:none 前者隐藏位置还在,后者隐藏位置消失

  6. [转]Oracle开发专题之:%TYPE 和 %ROWTYPE

    本文转自:http://www.cnblogs.com/kingjiong/archive/2009/02/19/1393837.html 1. 使用%TYPE 在许多情况下,PL/SQL变量可以用来 ...

  7. Leetcode 102. Binary Tree Level Order Traversal(二叉树的层序遍历)

    Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, ...

  8. C# string类型遇到的两个问题

    最近在维护一位离职的同事写的WPF代码,偶然发现他使用C# string类型的两个问题,在这里记录一下. 1. 使用Trim函数移除字串中的空格.换行符等字符串. csRet.Trim(new cha ...

  9. 浏览器是如何运行HTML的?

     什么是网页  网页(HTML page)是在浏览器(Browser)上运行并且可以与用户产生互动的应用程序.                            此图为浏览器运行HTML 这个想说 ...

  10. ASP.NET笔记之 ListView 与 DropDownList的使用(解决杨中科视频中的问题)

    1.Repeater用来显示数据.ListView用来操作数据 InsertItemTemplate和updateItemTemplate**Eval(显示数据)和Bind(双向绑定:不仅是需要展现, ...