图形学常见的变换推导
🏉

图形学常见的变换推导

Tags
GAMES101
Published
Published May 11, 2022
Author
本文是 Games101-现代计算机图形学入门 第三第四节课的笔记,相关视频在下方。
本文同时参考了《Unity Shader 入门精要》的第四章,作者公开了第四章的 PDF,可以在下面下载到。
candycat1992/Unity_Shaders_Book
本项目是书籍《Unity Shader入门精要》的配套源代码。最新版本请移步 本项目的Github页面 。 我们推荐您从Github上clone项目源码并及时检查更新。如果下载速度过慢可以移步 百度网盘地址 。 我们提供了包含书中所有插图的彩色版插图集锦: HTML, PDF 。 当年乐观地以为自己有时间写第二版,是我太年轻了...... 第一版由于我能力有限的确有很多问题,感谢大家一直以来的支持。当年在我有时间的时候曾经花了一些时间重写了第18章,本来是想要放到第二版里的,但是目前第二版遥遥无期,索性直接把改版后的第18章直接放出来,希望能让读者有新的收获: 改版后的第18章 。 由于数学章是全书的重要基础,我们决定把第四章公开,来及时让读者获取最新的第四章数学章的内容: PDF 。 注意 :我们可能会根据读者勘误随时更新该文档,内容和页号可能会与读者手中的版本不同,实体书中的勘误会在每次重印时进行修正。 尽管我们在本书的编写过程中多次检查内容的正确性,但不可避免书中仍然会出现一些错误,欢迎读者批评指正。任何关于本书内容、源码等方面的问题,欢迎读者反映到本书源码所在的 Github讨论页,也可以发邮件( lelefeng1992@gmail.com )联系笔者。 关于目前 已发现的错误我们会及时在网上更新: 勘误列表 。 我们也维护了读者反馈的问题列表: FAQ 。 我们 推荐使用Unity 5.0以上的版本来编译本项目。如果你打算 使用更低版本的Unity,那么在学习本书时可能就会遇到一些问题 : 你可能发现会有些菜单或变量在你的Unity中找不到,这可能就是由于Unity版本不同造成的。绝大多数情况下,本书的代码和指令仍然可以工作良好,但在一些特殊情况下,Unity可能会更改底层的实现细节,造成同样的代码会得到不一样的效果(例如,在非统一缩放时对法线进行变换)。 还有一些问题是Unity提供的内置变量、宏和函数,例如我们在书中经常会使用UnityObjectToWorldNormal内置函数把法线从模型空间变换到世界空间中,但这个函数是在Unity 5中才被引入的,因此如果读者使用的是Unity 5之前的版本就会报错。类似的情况还有和阴影相关的宏和变量等。 和Unity 4.x版本相比,Unity 5.x最大的变化之一就是很多以前只有在专业版才支持的功能,在免费版也同样提供了。因此,如果读者使用的是Unity 4.x免费版,可能会发现本书中的某些材质会出错。 在本书编写时,我们使用的版本是Unity 5.3,因此使用这些Unity版本的读者请使用本项目 master 分支的相关代码。 Unity 5.4对Shader部分进行了一些比较大的更新,比较明显的变化有: 使用了unity_XXX来代替原有的XXX变换矩阵,例如_Object2World被替换成了unity_ObjectToWorld,_World2Object被替换成了unity_WorldToObject(均在UnityShaderVariables.cginc文件中被声明),_LightMatrix0被替换成了unity_WorldToLight(在AutoLight.cginc文件中被声明)。 使用了一些内置函数来代替某些运算,例如mul(UNITY_MATRIX_MVP,)相关计算被替换成了UnityObjectToClipPos()。 在学习本书时,读者需要注意代码中一些由于更新造成的变化。 从Unity 5.5开始,Unity在某些平台(如DX11、DX12、PS4、Xbox One、Metal)等平台对深度缓存进行了反转操作,使得在近平面处的深度值为1,而远平面处为0。这样做的原因主要是为了更加充分得利用浮点深度缓存,具体原因可以参见NVIDIA的相关博客 Depth Precision Visualized。Unity在 Upgrading to Unity 5.5和 Platform-specific rendering differences 文档中对此进行了说明。 在本书代码中,我们在第13章用到了深度纹理,其中对于使用了Linear01Depth、LinearEyeDepth等Unity内置函数的部分不受此变化影响,但我们在Chapter13-MotionBlurWithDepthTexture中直接访问了深度值来计算世界空间下的坐标: // Get the depth buffer value at this pixel.
candycat1992/Unity_Shaders_Book
闫老师的推导十分简洁易懂,我也尽量把过程补充到文章中,读者看了我相信肯定也能跟着思路把变换公式推导出来。
在读本文的过程中,也推荐参考上面提到的视频和 pdf 互相参考,本文是视频中推导的详细笔记,冯乐乐的 pdf 中虽然没有投影变换的推导,但是在很多地方都把理论讲的十分清晰,例如必要的数学基础和各种图形学概念的讲解。
 
🛎️
线性变换
 
🛫
齐次坐标
 
🥉
三维变换
 
💡
四元数 我们上面所用到的旋转矩阵是不太适合做插值的,例如二维旋转 10 度的旋转矩阵加二维旋转 20 度的旋转矩阵求平均,不能得到二维旋转 15 度的旋转矩阵。四元数在这方面方便很多。
 
🧻
View/Camera Transformation 视图变换
 
🏒
Projection Transformation 投影变换
 
🌤️
视口变换