代码中使用列主元还是行主元?当然都可以。如果是行主元,在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. Controllers

    Controllers Controllers are the bread and butter of the framework they control when a model is used ...

  2. Linux 学习笔记 基本的bash shell命令

    Linux 文件系统 Linux讲文件存储在单个目录结构(虚拟目录)中,虚拟目录包含了安装在PC上的所有存储设备的文件路径. Linux虚拟目录中比较复杂的部分是它如何来协调管理各个存储设备.Linu ...

  3. 关于Java中return和finally谁先执行.

    例子一: public class A { public static void main(String[] args) { System.out.print(tt()); } public stat ...

  4. Xilinx 网站资源导

    Xilinx 网站资源导读 ———版权声明———–本文作者 Ricky Suwww.fpganotes.comrickysu.fpga@gmail.com 欢迎转载,转载请保持原样及署名商业使用须得到 ...

  5. JDK Tools - xjc: 将 XML Schema 编译成 Java 类

    xjc 是 JAXB 将 xsd 生成 Java 类的工具. 命令格式 xjc [ options ] schema file/URL/dir/jar ... [-b bindinfo ] ... 命 ...

  6. activiti源码解读之心得整编

    TaskService.completeTask()的执行内幕是啥? activiti采取了command模式,completeTask会被包装成一个CompleteTaskCmd,一个Cmd执行的时 ...

  7. IIS启用SSL

    安全套接字层 (SSL) 是一套提供身份验证.保密性和数据完整性的加密技术.SSL 最常用来在 Web 浏览器和 Web 服务器之间建立安全通信通道.它也可以在客户端应用程序和 Web 服务之间使用. ...

  8. lrzsz on linux

    Linux Disibutaion:Ubuntu 16.04.1 LTS lrzsz是一款在linux里可代替ftp上传和下载的程序. 1.下载lrzsz源码包 #下载源码包 wget https:/ ...

  9. 20160510--hibernate懒加载问题

    懒加载 通过asm和cglib二个包实现:Domain是非final的. 1.session.load懒加载. 2.one-to-one(元素)懒加载: 必需同时满足下面三个条件时才能实现懒加载 (主 ...

  10. Android开发常见问题及解决方法

    http://blog.csdn.net/silangquan/article/details/8104414