我常常这么大胆的认为,搞科学的人总是喜欢用各种让常人难以理解的复杂方式去处理某些其实可能很简单的事情,这种情况在他自身擅长的、有着诸多对手竞争的领域上极为常见。比如吧,搞DirectX的人用了左手坐标系,搞OpenGL的人偏偏就要用右手坐标系。这种情况的目的,是让他们那些搞科学的人得以突出他们的存在感和优越感。这种增加了这么多记忆成本只为了让他们爽一爽的事儿,对于我这种被科学搞了的人来说 ,就只剩下纠结和郁闷这两种感觉了。以上是某天看书看烦了的感想。

Anyway,在学习RenderMonkey的过程中,纠结于书上的各个例子无法正确实现,总是有顶点的矩阵变换出问题。最后发现是代数没学好,好吧。。。今天在看了这篇文章后,恍然大悟了很多事情,而结果又再度认证了我开篇说的那个看法:他们就是想爽一爽,让大家知道这东西是他搞出来的。。。MLGB

先复习一下线代:

1,向量与矩阵相乘的乘法中,把矩阵放在左边的叫左乘或者前乘,或者pre-multiplying。把矩阵放在右边的叫右乘或者后乘,或者post-multiplying。
2,对于矩阵的结合顺序来说,貌似是这样:左乘的时候,结合顺序是从右到左。右乘时反过来。(有待求证,我数学不好,欢迎拍砖)。
3,Row-major指的是行向量矩阵,Column-major指的是列向量矩阵。
4,数学上(注意这三个字,很重要),行向量与矩阵相乘(右乘),应该乘以一个Column-major的矩阵。矩阵与列向量相乘(左乘),应该是一个Row-major矩阵。
5,内存上(参考4),矩阵在内存里是按照一个数组来排列的,也就是说,归根结底是一唯的。怎么把矩阵这个二维的数据映射到一唯呢?可以按行优先,即先从左到右,后从上到下,一个个数下去。所谓Row-major。你也可以,按列优先,即先从上到下,后从左到右,所谓Column-major。

那么,如果,在计算机的3d世界里,它的数学上和内存上统一的话,世界就清净了。。。

问题就是,各个API都不统一,而且还很乱。MB的存在感,懂科学很了不起啊。。。。

以DirectX为例。

DirectX默认,数学上,用行向量乘以列优先矩阵来表示矩阵变换。但是,不知道哪个蛋疼的天才发明,DX的内存里存矩阵,使用行优先的方式去存的。。。。。而同为微软家的HLSL,数学上默认也是使用列优先矩阵,存储上貌似也是列优先,终于不那么蛋疼了。所以,你得这么理解,用D3DXMatirxXXXXX函数生成的矩阵,数学上是一个列优先矩阵,用行优先的方式保存在内存中。当使用ID3DXConstantTable::SetMatirx向Shader传矩阵的数据的时候,是这样,把按照行来保存的矩阵一列一列读出来,每列放到一个寄存器里,于是到了shader里就变成列优先矩阵了。。。

OpenGL呢,嘿嘿嘿,全他妈反过来。他数学上使用左乘(行向量矩阵),因为他的向量是列向量,然后存储上,却是使用列优先存储矩阵。。。。

不过,拿一个位移矩阵分别按照行优先和列优先的数学意义去验证一下,你会发现,DX和GL在存储位移分量的位置,却是惊人的统一(都是12、13、14向量表示x, y, z的偏移,具体在上面那个链接的文章里讲有,因为其实计算上错了两次,但却最后得到正确的结果,有点“负负得正”的意思)。

好极了。到了RenderMonkey。。。。

老实说,我是个偷懒的人,RM的说明书我没有仔细看,我估计它写有,但是我偷懒,于是付出了代价。

是这样,RM里手动添加的矩阵,是按照行优先的数学意义的(左乘矩阵),存储上我不知道是什么。。。。然后,shader编辑器里,默认是列优先的(右乘矩阵),搞明白这点,你的生活就没这么miserable了。

专注于Shader吧。

纠结和郁闷的存在感-关于DirectX与HLSL的矩阵存储方式---转载好文章的更多相关文章

  1. DirectX 9 UI三种设计学习笔记:文章4章Introducing DirectInput+文章5章Wrapping Direct3D

           本文从哈利_创.转载请注明出处.有问题欢迎联系本人!        邮箱:2024958085@qq.com 上一期的地址: DX 9 UI设计学习笔记之二 第4章 Introducin ...

  2. hlsl 和cg 涉及 mul 左乘 右乘

    error: 1. mul' implicit truncation of vector type 2. matrixXXX: array dimensions of(unknown scope en ...

  3. Cocos Creator 中 _worldMatrix 到底是什么(中)

    Cocos Creator 中 _worldMatrix 到底是什么(中) 1. 中篇摘要 在上篇中主要做了三件事 简单表述了矩阵的基本知识,以及需要涉及到的三角函数知识 推导了图形变换中 位移 .旋 ...

  4. OpenBSD为何还在用CVS之感

    一个轻松无聊的晚上突然想到一个问题——在当今这个Git大红大紫的时代,OpenBSD为何还在用CVS代码仓库?连他同阵营的FreeBSD都已经改用SVN,宣布逐渐废掉CVS了……问了下google,搜 ...

  5. 矩阵-DirectX与OpenGL的不同

    http://www.cnblogs.com/graphics/archive/2012/08/02/2616017.html 矩阵是三维图形学中不可或缺的部分,几乎所有和变换相关的操作都涉及矩阵,世 ...

  6. DX11 Without DirectX SDK--02 渲染一个三角形

    回到 DirectX11--使用Windows SDK来进行开发 目前暂时没有写HLSL具体教程的打算,而是着重于如何做到不用DirectX SDK来进行渲染.除此之外,这里也没有使用Effects框 ...

  7. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 全书总结

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 全书总结 本系列文章中可能有很多翻译有问题或者错误的地方:并且有些章节 ...

  8. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二章:矩阵代数

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二章:矩阵代数 学习目标: 理解矩阵和与它相关的运算: 理解矩阵的乘 ...

  9. opengl入门学习

    OpenGL入门学习 说起编程作图,大概还有很多人想起TC的#include <graphics.h>吧? 但是各位是否想过,那些画面绚丽的PC游戏是如何编写出来的?就靠TC那可怜的640 ...

随机推荐

  1. xp/2003开关3389指令

    开启3389: @echo offtitle 开启3389clsrem 开启3389reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\ ...

  2. 使用Visual Studio 2012 开发 Html5 应用

    Visual Studio 一直以来是开发微软旗下应用的利器,只要是开发微软相关的应用无论是Windows程序,WPF,Asp.Net,WinRT Surface,WindowsPhone 等微软旗下 ...

  3. Unity 处理策划的 Excel

    很多时候我们需要使用策划的Excel表来做游戏的静态数据配置, 而不是采用自己定义的xml或者U3D的scriptobject. 因为很多数据都是策划处理的,而策划最喜欢的就是excel,也只会用这个 ...

  4. Cortex-M3/4的Hard Fault调试方法

    1 Cortex-M3/4的Fault简介 Cortex-M3/4的Fault异常是由于非法的存储器访问(比如访问0地址.写只读存储位置等)和非法的程序行为(比如除以0等)等造成的.常见的4种异常及产 ...

  5. codeforces 425B Sereja and Table(状态压缩,也可以数组模拟)

    题目 给出一个n*m的01矩阵, 让你最多改变k个里面的值(0变1,1变0), 使得0.1的连通分量是矩阵.输出最少步数 1 ≤ n, m ≤ 100; 1 ≤ k ≤ 10 题解: 如果01连通分量 ...

  6. (转)xmpp 环境配置-支持扩展

    第一种方法直接拖 1> 拖入文件夹 在网盘链接的xmppFramework文件夹 :http://pan.baidu.com/s/1jGxLa3G 也可以直接去github搜索下载. 2> ...

  7. MySQL 5.1参考手册

    目录 前言 1. 一般信息 1.1. 关于本手册 1.2. 本手册采用的惯例 1.3. MySQL AB概述 1.4. MySQL数据库管理系统概述 1.4.1. MySQL的历史 1.4.2. My ...

  8. poj 3072(最短路)

    题目链接:http://poj.org/problem?id=3072 一涉及稍微计算几何方面的东西就要做好久,一开始先用SPFA写的,可能是由于松弛次数过多导致精度损失,郁闷了好久,然后改成Dijk ...

  9. python编写规范

    一.说明 二.内容 1. 代码布局 1.1 缩进 1.2 表达式和语句中的空格 1.3 行的最大长度 1.4 空行... 1.5 编码... 2. 语句... 2.1 标准头部... 2.2 导入(i ...

  10. C语言标准

    1,K&R C 1978年, Dennis Ritchie和Brian Wilson Kernighan合作出版了<The C Programming Language>的第一版. ...