当前位置: 华文星空 > 知识

零基础如何学习计算机图形学?

2016-03-17知识

就像其他答主说的一样,我不建议上来就逮着一本Direct3D或OpenGL的书看到死。这些API只是图形学的一部分。上来就看这种东西,把握不住轻重细节。这些API中的设计,有些东西是工业上的取舍,有些是历史遗留问题,没有重点的看,就是浪费时间。

大多数关注这个问题的程序员,其实主要是关注渲染方向(做游戏)。(真去做simulation的研究生也不需要问这个问题。)

但还是要提一嘴,图形学一般包含这几个领域:几何(Geometry),渲染(Rendering),仿真或模拟(Simulation)等等。

不要自我设限。

以下讲的内容以渲染为主。

渲染按需求可以粗略分成实时渲染和离线渲染。实时渲染主要服务于游戏等实时交互应用,离线渲染服务于影视特效,3D动画。

实时渲染使用光栅化(Rasterization)方法,离线渲染使用光线追踪(Raytracing)和光子映射(Photon Mapping)方法。不过这两年在nVidia的努力下,实时渲染也开始用光线追踪了。

——————

入门

我建议刚开始不要关注图形API和GPU,只专注原理,只考虑用CPU渲染 ,GPU和API能干的事情,CPU都能干,只是速度慢。

1. @闫令琪 教授的图形学入门课程GAMES101。

录像在b站能搜到。

这个教程非常友好,中文,讲解清晰。包含8次小作业和1次大作业。

大作业有十几个选题,都有一定挑战性,如果有时间,建议全部完成。

2. Fundamentals of Computer Graphics, Fourth Edition

图形学名著,虎书,可以作为作为GAMES101的补充。

在这两个教程的学习过程中,可以抱着两个目标来学习:

  • 写一个软件光栅化渲染器 ,能正确渲染obj模型,Phong光照模型,有纹理,材质等功能,规模几百到几千行不等,具体取决于你想实现多少效果,能实现体渲染,环境光遮蔽等比较时髦的效果就更好了。
  • 写一个软件光线追踪渲染器 ,能正确渲染obj模型,有纹理,材质等功能,有加速结构,能并行化。规模几百到几千行不等。
  • 建议用C/C++,因为软件渲染本来就很慢了,你用其他更慢的语言是能渲染,但会很痛苦。

    而且,图形学目前是离不开C++的。

    虽然说『不要随意造轮子』,但我实在是想不到比造轮子更快更透彻去学习一个学科的方法了,更何况,图形学的轮子,难度曲线较为平缓,可以先写个几百行的功能简陋的渲染器看看效果,再慢慢追加其他功能。

    围绕上面两个目标,你就可以找资料了。

    软件光栅化渲染器——tinyrenderer:

    国外一个大佬写的几百行的软件光栅化渲染器,API模拟了OpenGL,主要目的在于理解OpenGL在后台干了什么。

    看看渲染效果:

    软件光栅化渲染器——mini3d:

    @韦易笑 大佬写的软件渲染,代码整洁,中文注释,适合自己拆着玩。

    软件光线追踪渲染器:

    这个系列非常棒,几十页PDF,几百行C++就可以让你写一个光线追踪渲染器,用最快最直观的方式让你感受『基于物理』(Physically-based)带来的威力。

    实时渲染

    1. Real-Time Rendering, Fourth Edition

    图形学名著,实时渲染第四版,18年出版,包含这几年的实时光线追踪章节。

    很多人说这本书只是图形学一个目录,因为这本一千页厚的书,引用了2000多文献。

    这个说法没错,但是这个说法容易给新手造成误导,以为这本书很蜻蜓点水。

    其实,作为基础和拓展视野来讲,这本书非常完备,刚开始看这本书,不要管那些引用文献,专注去看就完事了。

    2. @闫令琪 教授的高质量实时渲染课程GAMES202

    2021年3月13日开课。当然也可以看录播。

    这门课结合上文rtr4一起学习是极好的。

    这个阶段,如果有心想学习游戏引擎,或具体的渲染管线。可以自己结合一种API,或者引擎。

    手工造一套渲染管线,并实现各种效果,各种阴影,PBR,SSAO,TAA,全局光照等等等等。

    这里我依然不会推荐图形API的教程,因为这是可以自己搜索解决的。

    离线渲染

    1. PBR3,也就是【基于物理的渲染(第三版)】

    图形学名著,作者详细的讲解了pbr材质,pbr相机模型,光线追踪,双向路径追踪,光子映射方法等等,可以说是面面俱到,而且,本书配套一个C++编写的代码结构清晰的准工业级渲染器:

    规模大概在3万行,结构清晰,在对整个项目的结构梳理清晰后,就可以选择性的看了。

    展示一下pbrt-v3的渲染图片:

    pbrt4今年要出版了,作者集成了对英伟达OptiX的支持,可以用 GPU 加速了。

    pbrt-v4代码:

    如果想走学术道路的话,pbrt是一个很好的起点。图形学的研究,不像AI有那么多成熟的框架。一篇图形学论文可能需要自己搭建大量的脚手架,写上几万行C++不算离奇的。pbrt可以作为一个基础渲染器,在其上实现自己需要的效果。

    2. mitsuba2渲染器

    非常强悍的开源渲染器,学术界常用。闫老师说它的正确性是可以放心的。我没用过,只提一下。

    3. 全局光照算法技术

    图形学名著,Advanced Global Illumination的中文翻译版。原书有点老,但是以数学方法为主,适合梳理原理。

    物理与模拟

    不是我了解的方向,但是最近有几个非常不错的课程/书籍。我觉得应该推荐一下。

    1. GAMES103: 基于物理的计算机动画入门

    即将开始的物理模拟课程,主要是刚体物理,难度较低,适合用此课入门游戏物理。

    2. @胡渊鸣 大佬的物理引擎课程:

    胡渊鸣是太极(taichi)编程语言的作者,这课也是以taichi讲解的

    这个课有编程作业,幸运的同学可以获得纪念品。

    课上完成作业拿到的纪念品
    taichi写的raytracer

    这门课难度曲线比较陡峭,所以今年推出了太极图形课。

    感兴趣的可以了解下。

    3. 基于物理的建模与动画

    译者就是质量保证。

    想了解游戏物理引擎原理的同学,这本书非常友好。

    4. box2d-lite

    box2d是一个非常流行的物理引擎,愤怒的小鸟,蜡笔物理学,地狱边境等知名游戏都是box2d实现的,box2d-lite是作者写的一个简易版本,几百行C++,适合教学用。

    准确的说,box2d-lite是作者与GDC 2006展示的版本,是box2d早期版本。

    对了,关于游戏用到的图形学,有一系列文章,叫精粹(gems)。

    从上个世纪末开始,平均每年都会出一本。内容就是各个业界大牛写的文章,按主题编纂的到一起,内容比较强调实践,需要一定基础。

    按时间顺序大概有:

  • Graphic Gems 1-5
  • ShaderX 1-7
  • GPU Gems 1-3
  • GPU Pro 1-7
  • GPU Zen
  • Raytracing Gems
  • 建议按时间倒序看,最近的Raytracing Gems就很不错,详细讲了DXR的实践。

    太早的Graphic gems都是上个世纪的了,参考价值下降了很多。

    ——————

    数学

    有些人喜欢把图形学妖魔化,动不动就说得好像不学个几年数学根本不能去碰图形学。

    其实以大部分人学图形学的目的——以渲染为主,做工程做游戏做应用,这样数学的要求并不艰深。

    即使是大多数做图形学研究的同学,在遇到数学短板时,也是随用随学。

    基础的数学包含这四个:

  • 微积分。
  • 线性代数。
  • 概率论与统计。
  • 数值分析。
  • 另外,学习渲染还需要结合很多其他领域的知识,仅仅拘泥于图形学本身,那就是自我设限。

    比如闫令琪老师有一篇论文就是模拟毛发髓质对光线通过时产生的影响。这项成果被用于【猩球崛起3】的毛发渲染。这意味着需要了解生物毛发的生理结构,才能搞清楚毛发对光产生的散射。

    在渲染中,常用到以下几方面的其他领域知识。还是那句话,什么都会涉及一点,可能不深,但不要自我设限。

  • 一点几何光学。
  • 一点辐射度量学(Radiometry)。光照在场景中的传输以次为基础计算。物理量是客观,线性的。
  • 一点光度学(Photometry)。光辐射使人眼产生的总的目视刺激的度量,研究客观的光辐射与主管视觉感受和心理感受的关系。(你可能看到过「伽马校正「之类的名词,它属于这个领域)
  • 一点色度学(Colorimetry)。研究人的颜色规律、颜色测量理论与技术的科学。颜色是一种外界刺激产生的主观反应。色彩空间,色彩模型,都是这个领域的概念。
  • 相关回答: