向GLM开炮!

最近在为数学库添加一点实时渲染上的东西...
简单地说就是那几个矩阵,LookAt,Perspective,Ortho
老朋友了不是


但我今天不是来讲怎么推出这些东西的
看标题就知道我是来批判...GLM的
这几天块给我整破防了(虽然也不是GLM的错
但我还是要吐槽几句

{{{(>_<)}}}

1. 矩阵以列为主序

不是我说,我长这么大,矩阵就没竖着读过,您给我整个列主序啥子意思啊
抛开这是OpenGL要求得内存布局不谈,你就不能搞个行主序版么qwq

如果和我一样坚持行主序,其实还是有解决方法的,对于需要传入OpenGL的矩阵在传入前Transpose下就好,或者在Shader中transpose(
当然在我数学库的实现中Transpose的计算量。。。貌似不算很小
所以引出方法二,把左乘矩阵改成右乘 例如 gl_Position = proj * view * model * aPos; 此时改为 gl_Position = aPos * model * view * proj

列主序真的抽象啊抽象

2. 左右手坐标系之谜

大伙应该都听说过OpenGL是右手系的,然而一转头又听说它是左手系的,一下子脑袋嗡嗡的

然而事实是这两者都有点几把道理
因为GLM和固定渲染管线(So called legacy openGL)的矩阵函数生成的Model,View matrix,确实是右手系得
但是,在经过了Vertex Shader,或者说进入了NDC后才是左手系
那么谁把啊好好的右手拧到左手来了?投影矩阵!
欸那不应该是在Clip Space时就是右手系么,咋还说NDC才是右手系
这又是很抽象的一件事了,咱都知道左手右手系就差在Z轴方向不同上,那么我想要把方向掰过来,就是把点左乘一个第三行为-1的单位矩阵对吧

这点应该很好想,相当于把点变换了一个坐标基,而这个坐标基z轴正向相反

另一点值得注意得事这些左手右手其实都不是强制得,可以看作一种松散可调整得Convention,但由于默认就这几把样子,所以大部分人形成了一定得共识

但抽象的来了,它偏不,他要乘一个除了第三行都是-1的单位矩阵,然后靠着GPU自动做的透视除法除以一个负的w分量来把其他分量化到正确的符号

这点你可以靠推一个投影矩阵然后对着GLM的perspectiveRH_ZO或者perspectiveRH_NO来验证
至于我嘛..我被搞烦了,目前只保证在FoxMath里的右手系正确....而且我把API调教(抄)的和GLM差不多力,来保证了其结果的正确

用其他人得轮子很爽,但是自己造轮子超级爽

哦对了,还有呢...再是众所周知的,Vulkan的坐标是事右手系了(看来Khronos也被坐标系搞来搞去搞得烦了)
但是Vulkan大部分人用的还是GLM,那么他们是怎么处理Perspective翻转问题的呢?
答案事翻转Y轴,proj[1][1]* =-1 (把左右手翻翻康康)

其实GLM还有个define叫做GLM_FORCE_LEFT_HANDED,设置了以后就会切换到左手系得矩阵上,更抽象得事它得投影矩阵在这时候又不换手了

在GLM文档中提到了 By default, OpenGL is using a right handed coordinate system. However, others APIs such as Direct3D have done different choice and relies on the left handed coordinate system.
所以我估计这个选项就是为了dx准备的 不过人DX有官方数学库,而且坐标系哪有你抽象

END