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

    nginx (pronounced "engine x") is a free open source web server written by Igor Sysoev, a R ...

  2. Android_SeekBar

    xml: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:too ...

  3. MyBatis6:MyBatis集成Spring事务管理(下篇)

    前言 前一篇文章<MyBatis5:MyBatis集成Spring事务管理(上篇)>复习了MyBatis的基本使用以及使用Spring管理MyBatis的事务的做法,本文的目的是在这个的基 ...

  4. win7为鼠标右键添加“用Photoshop编辑”选项

    1. 确认你注册表编辑器下,HKEY_CLASSES_ROOT\Applications\Photoshop.exe下的shell下的open下的command的右侧默认键值为 "D:\Ad ...

  5. 【转】Emmagee app性能测试工具使用教程

    简介 Emmagee是网易杭州研究院QA团队开发的一个简单易上手的Android性能监测小工具,主要用于监控单个App的CPU,内存,流量,启动耗时,电量,电流等性能状态的变化,且用户可自定义配置监控 ...

  6. PHP之数组遍历

    数组在PHP中是一个非常强大的武器,用起来方便.容易,由于使用起来异常灵活,用它就可以实现数据结构中的链表.栈.队列.堆以及所谓的字典.集合等,也可以转换成XML格式. 1.使用for for语句遍历 ...

  7. Android richtext

    在项目开发过程中经常会遇到很多需要显示不同样式的,不同风格的文本信息:对此可以使用多个TextView来分别设置自已想要的样式以满足需求,但是使用多个TextView的方式不太好:使用多个TextVi ...

  8. JavaScript学习笔记(8)——JavaScript语法之运算符

    一. 算术运算符: 运算符 描述 例子 结果 + 加 x=y+2 x=7 - 减 x=y-2 x=3 * 乘 x=y*2 x=10 / 除 x=y/2 x=2.5 % 求余数 (保留整数) x=y%2 ...

  9. JavaScript解析json

    后台数据经常以json数据格式传回前台,解析当然首选JSON对象. JSON对象有两个方法,使用JSON.parse(str)可以将json字符串解析成js中的对象. var o = JSON.par ...

  10. JAVA时钟

    效果图如下: //简单动态时钟程序,以图形和数字两种方式来显示当前时间 import javax.swing.*; import java.awt.event.*; import java.awt.* ...