我常常这么大胆的认为,搞科学的人总是喜欢用各种让常人难以理解的复杂方式去处理某些其实可能很简单的事情,这种情况在他自身擅长的、有着诸多对手竞争的领域上极为常见。比如吧,搞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. CHtml::radioButtonList

    public function getSortList(){ $arr = array(); $arr[0]['id']=0; $arr[0]['name']="否"; $arr[ ...

  2. ajax原理总结附简单实例及其优点

    在工作中用了Ajax N多次了,也看过一些相关方面的书籍,也算是认识了它,但是一直没有认真总结和整理过相关的东东,失败! 近有闲情,将之总结如下: [名称] Ajax是Asynchronous Jav ...

  3. 浅谈MySQL索引背后的数据结构及算法【转】

    摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BT ...

  4. Xmarks丢失书签

    想体验下Xmarks,不同浏览器同步书签,听说很好用,就安装Chrome插件,没想到竟然把我的所有书签都丢了. 不过在网上找到了回复的办法,也很简单: 原始地址:http://irising.me/2 ...

  5. 超快的 FastText

    Word2Vec 作者.脸书科学家 Mikolov 文本分类新作 fastText:方法简单,号称并不需要深度学习那样几小时或者几天的训练时间,在普通 CPU 上最快几十秒就可以训练模型,得到不错的结 ...

  6. C内联汇编

    用C写程序比直接用汇编写程序更简洁,可读性更好,但效率可能不如汇编程序,因为C程序毕竟要经由编译器生成汇编代码,尽管现代编译器的优化已经做得很好了,但还是不如手写的汇编代码.另外,有些平台相关的指令必 ...

  7. C#产生不重复的随机数并生成随机文件名

    本文转自:http://blog.ciznx.com/post/csharprandomnumberandrandomfilename.aspx 在项目中会遇到需要批量生成文件的时候,比如 asp.n ...

  8. hdu 1567 2006 (题意理解容易出错)

    #include<stdio.h> #include<vector> #include<algorithm> using namespace std; struct ...

  9. 基于RPC原理的dubbo

    在校期间大家都写过不少程序,比如写个hello world服务类,然后本地调用下,如下所示.这些程序的特点是服务消费方和服务提供方是本地调用关系. 而一旦踏入公司尤其是大型互联网公司就会发现,公司的系 ...

  10. JavaPersistenceWithHibernate第二版笔记-第五章-Mapping value types-007UserTypes的用法(@org.hibernate.annotations.Type、@org.hibernate.annotations.TypeDefs、CompositeUserType、DynamicParameterizedType、、、)

    一.结构 二.Hibernate支持的UserTypes接口  UserType —You can transform values by interacting with the plain JD ...