图形学是一门综合学科,涉及的基础学科内容繁多,多用于跨领域的工程应用,比如传统的图像处理、游戏引擎,现在比较热门的图像分割、人脸识别、无人驾驶、AR/VR、三维重建、医学影像等等,未来随着图形硬件、网络带宽的进步,前景更加广阔。
当然,学习有一定门槛,有不少前置的知识依赖,要学好,得耐得住寂寞。
工作方向调整,笔者今年6月份开始接触图形渲染相关工作,这里分享笔者从零开始学习图形渲染和对该领域的前景的思考。
一、图形学roadmap
根据自己的理解,画了一张简单的学习路线图,
上面是按照渲染功能来划分,也可以按照工程职能来划分细分领域
如果工作非常着急使用openGL,可以先单独学习openGL,熟悉openGL提供的API,也能勉强应付简单的渲染。如果时间充裕,建议按照笔者上面列举的顺序,从下至上依次学习,先练好内功,到后面的工程应用会轻松很多,而且理解更透彻。
二、学习资料推荐
网上的资料很多,笔者这里按照自己的喜好列出学习的参考资料
2.1 前置学科基础(非必须)
(1)一元微积分:微积分是计算机视觉的基础,涉及到偏导梯度、傅里叶变换等重要概念。推荐《普林斯顿微积分读本》,深入浅出。作者也很俏皮,千万不要再去读大学的那几本同济版了,有毒。这本书只介绍了一元微积分,还需要补充多元微积分的基础。
(2)多元微积分:参考这位博主的笔记来学习,很精简,适合快速复习https://www.cnblogs.com/bigmonkey/category/1142620.html
时间充裕的朋友,可以另外参考MIT的网易公开课:
网易公开课:MIT单变量微积分35讲
http://open.163.com/special/sp/singlevariablecalculus.html
网易公开课:MIT多变量微积分35讲
http://open.163.com/newview/movie/courseintro?newurl=/special/opencourse/multivariable.html
(3)线性代数
线性代数是图形处理之母,一定要学好,如果时间紧张,至少也要理解“矩阵转置”、“叉乘求法向量”、“求逆”、“投影矩阵”等重要的线代概念。
推荐两套教材
** Sheldon Axler写的《线性代数应该这样学》**,不算厚。换一种思路看线性代数的本质,同样劝退大学的那本教材吧!有毒 1!
image
另外,笔者20年趁疫情期间刷了一遍MIT Gilbert Strang 教授的的线性代数,讲的特别好,有大量工程实践的案例
http://open.163.com/newview/movie/courseintro?newurl=/special/opencourse/daishu.html
中国大学的线代不好学,主要侧重公式运用和计算,脱离实际工程,学生很难理解本质,融会贯通。
感谢这位风趣幽默的老头,贡献了这么好的教程。
再补充一个不错的数学博客,作者博士期间整理的学习笔记:https://zlearning.netlify.app/math/
(4)信号原理:
笔者参考的是北航 江志红老师的《深入浅出数字信号处理》,只看了前5章节,讲脉冲、信号滤波、傅里叶变换、离散傅里叶变换等非常基础的信号理论知识,目前还够用,后面需要再继续深入。
2.2 图形学基础(重要)
如果想深入理解openGL,最好是先学习一遍图形学基础,openGL可以理解是“图形学理论”的具体设计实现。否则直接上openGL涉及一些图形学概念,会很突兀。
笔者参考的是中译本《视觉计算基础》,内容安排的很好,详略得当,作为基础够用了。翻译者是四川大学的赵启军老师,学习过程中,有几处疑似错误,给出版社、四川大学都发了邮件,没有鸟我,伤心~~
2.3 接下来到了有趣的实践环节,openGL学习。
openGL的学习分两部分:
一要学习opengl基础图形API;二****要积累opengl shader的编写,包括常见的特效滤镜实现
同学们也可以选择iOS平台的metal、Android平台的vulkan作为图形渲染的开发接口,笔者这里选择openGL,一方面是工作需要,另一方面考虑openGL在工程领域应用时间较长,有丰富的资料可以查,作为学习入门是比较合适的
2.3.1 opengl基础学习
参考资料:
免费网络资料:https://learnopengl-cn.github.io/
这套资料很良心,一是免费,二是涉及的代码、图片资源都整理的很好,到了工程编码环节,有源码事半功倍,不懂的地方,直接看代码。
笔者参考这套学习资料,把每章节的demo也撸了一遍,受益良多。
有兴趣的朋友们,也可以参考:
opengl学习笔记:https://www.jianshu.com/p/fe01787b1de1
另外推荐一本openGL资料作为补充,《OpenGL ES 3.0编程指南》
注意:openGL ES 是针对移动端的API讲解,接口有点老,有些关键字接口和opengl不一样,学习时不用纠结,知道就好。
想学好openGL没有好办法,就是多练习,多总结。过一段时间,就能慢慢体会到openGL渲染管线的逻辑,体会“为什么说opengl 是一个状态机”,感受GPU编程的魅力。
关于opengl有两张很重要的图,理解好这两张图非常重要。
**1)坐标变换 **
2)渲染流程
2.3.2 shader技巧
1)shader教程:
https://thebookofshaders.com/
2)shader集合,这里面有各种各样的shader 算法实现
https://www.shadertoy.com/
后记:
经典图形学在工程应用上,面对复杂的问题,往往有很多bad case,结合机器学习能解决一部分问题,图形学也是机器学习的一大领域,同时对ML感兴趣的同学可以朝这个方向发展,笔者尚未涉猎该领域,暂不能提供合适的资料。
到此,关于渲染的理论基础和工程应用基础就告一段落了。再往后深入,要结合工作需要,选择一个具体的细分领域深入学习。笔者也是刚进入到图形处理领域,了解的不多,这里推荐一些讲图形渲染的资料。
- ** PBR(基于物理的渲染)**,光照是渲染里面比较难的一点,设计一个渲染效果逼真的算法,又能兼顾硬件性能并不容易。网上已经免费公开了该教程: http://www.pbr-book.org/3ed-2018/contents.html
- RTR (实时渲染),渲染领域的圣经。这本书第三版比较贵,最新的第四版便宜多了,有兴趣的同学可以在网上找找电子版的(白嫖)
以上,就是笔者关于图形学入门的心得,希望能对你有所帮助。