找回密码
 立即注册
查看: 1209|回复: 20

计算机图形学,下一步如何提高?

[复制链接]
发表于 2021-1-7 09:19 | 显示全部楼层 |阅读模式
计算机图形学,下一步如何提高?
发表于 2021-1-7 09:23 | 显示全部楼层
叶大神已经关注你的问题,但没有回答。
无论是图形学还是C++都是深坑,一旦进入,没有十几年的时间,是不会成为专家的。你存在的问题是:你的数学基础还不足你让能够完全看懂图形学那些书,你的项目经验还不足你让能够体会C++中那些要义,但书你已经买了很多,眉毛胡子一把抓地读了很多,当你读不懂的时候,你就应该意识到你的学习方式方法有待商榷了。
另外,我想问你:题主,你买那么多书做什么,你又不打算做学术研究,最关键的是还看不懂……买书只是形式,你已经陷入形式主义了,我觉得你已经陷入一种误区,即把买书等同于学习本身了。其实上不是,学习或一项技能的习得其实是一个要漫长很多的过程,本质上是在你的大脑内部长出新的神经突触,那些神经连接及神经网络构建的过程,是一个很漫长的过程,就像树木的成长一样,需要十几年甚至二十几年,常说“十年树木,百年树人”,就是这个道理,不能拔苗助长。关键是要动手写代码,以项目驱动,以需求驱动,只有这样才能形成正反馈。要明确自己的目标,然后把大的目标分割成无数个可以执行的小目标,divide and conquer,先把小目标一个个解决掉,最后大目标也就实现了。
我给你3条建议:
1.心里有个目标,有目标后直接上手写代码,实在不行就在Youtube上看视频学习。


我推荐的几个Youtube频道:
a.Handmade Hero频道,Handmade hero项目的目的就是教你一步一步开发一个2.5D游戏引擎的,里面有你想要学习的3d渲染部分知识。
https://www.youtube.com/user/handmadeheroarchive
最新一期是教你写一个光线追踪器
https://www.youtube.com/watch?v=pq7dV4sR7lg


b. 游戏引擎编程
https://www.youtube.com/watch?v=AAFkdrP1CHQ&list=PLmV5I2fxaiCI9IAdFmGChKbIbenqRMi6Z
两个频道的主人分别是Casey Muratori和Jonathan Blow(Jonathan Blow是《时空幻境》及《见证者》的开发者策划,可谓“独立游戏第一人”,独立游戏正是从他的《时空幻境》开始进入大众视野的),他们两个人都是有将近40年编程经验的人,从他们身上学到的都是干货


c.学习DirectX或OpenGL/OpenglES
网上有大把的视频,我不贴链接了。
2.前期研究cocos2dx/Orge3D,后期可研究Unreal/Unity,或者直接研究Unity或Unreal渲染相关的模块,这样你就有了目标,哪里不会学习哪里,就不会迷茫;


3.关注我的专栏 (偷笑
自制游戏引擎
发表于 2021-1-7 09:24 | 显示全部楼层
学而不思则罔,思而不学则殆。
一,3d引擎是一个工程与数学相互妥协的艺术结晶;
      1.1 工程要堆代码的
            仅在windows上一个实现一个简单的d3d demo就上千行的代码,任何一个状态的设置问题都有可能渲染错误,需要工程的思想与代码的水平,便引发下面的填坑技能:
          C++的坑,C++11的坑;C++调试的坑,图形调试的坑,VS,renderdoc,nsight的坑。多线程的坑,dll的坑; (不展开)
         字符串的坑,有几个人知道,char,TChar, unicode, uft8,utf-16,UCS2,utf-32, gb2312,这些编码规则之间的联系与区别;
         编译的坑,链接器的坑;每次编译工程要3个小时,习惯了就好。
         这些需要基本的功力,需要自己亲自动手去写的,需要时间的,不是一两本书就可能学会的。 (问题是没有书讲这个)
     1.2 数学:
        1.2.1最简单的: 图形学最基本的数学类型,float,这个大家都用过吧,但是IEEE-754的标准有多少人研究过,正负位,对数位,有效位,为什么(16,777,219.0f >= 16,777,221.0f),这些坑要爬过才能说是了解最基本的数学。
       1.2.2图形学的坑,
       1.2.2.1 简单测试模型总得会做吧
              不可能是个模型都从网上下吧,也不可能是个模型都让美术去做(分裂顶点的测试用例,UV镜像的测试用例,多个骨骼影响顶点的用例),3ds max, Maya的基本操作要会,做个带骨骼的小人会跑动应该会的。
      1.2.2.2 材质总得会制作
               基本的ps操作应该会,通道要熟悉,格式类型要熟悉,更不用说DDS,BC,DXT,ETC,AST的格式了,BC一共7个系,带不带alpha,哪个用来压diffuse,哪个用来压normal,哪个用来压mask,这个要知道,加压算法是什么,这个也要知道。
     1.2.2.3 模型总得会导入
              fbx的文档要读很多遍,FbxNode的11个变换矩阵每个是什么含义要了解,顶点,法线,光滑组,uv,材质,骨骼导入,蒙皮,morph,这些导入要会写,否则连模型都没有更不用谈图形学了。然后是对模型的处理,根据光滑组,材质分mesh,算normal,算Tangent,等等。 SpeedTree的一堆,AbcModel的一堆,加起来所有光模型导入的代码UE就2W行,没这2W行的代码,导进去的模型(特别是tangent)都不一定是对的,谈什么渲染。
     1.2.2.4 Tangent
              渲染的核心在于Tangent,因为光照需要Tangent。但是这个Tangent怎么算为什么要这么算,为什么ue,u3d,vray,xNormal, hoduni等都用业界标准算法Mikkt? 估计题主看完PBRT都不知道Geometry那章里,mesh shape里有很精确关于Tangent的定义,这是我见到过的最精确的Tanget空间的定义,参数化表面方程可以解决很多问题。不知道题主注意了没。说到Tangent就会说到BumpMap中的NormalMap,NormalMap与模型是depenent的而不是随手拿一个扰动下是个意思,自己写代码烘焙一个NormalMap就知道了,首先要保证低模的Tangent空间与渲染的目标Tangent空间一致。这就是UE文档中写到要用XNormal来烘NormalMap,因为XNormal用的是Mikkt算法,UE用的也是Mikkt算法,保证能还原出烘NormalMap的当时的Tangent。
     1.2.2.5 动画
            动画最基本的就是旋转了,有矩阵,四元数与欧拉角。矩阵,四元数是个标准旋转量,应该都知道。那骨骼动画曲线中一般存的是欧拉角(fbx),那么问题来了,欧拉角(Euler Angle)有6种轴序,2种表示方法:内旋外旋,Maya默认的轴序,3ds max默认的轴序,自己引擎的轴序,弄不明白这个连旋转都不对,就不要谈动画了,因为导进去就不动,动作肯定有问题。
    1.2.2.6 Render
         1.2.2.6.1 Rasteration
                    1.2.2.6.1.1 Forward Deffer Forward+ TilledDeffer 基础知识
                     1.2.2.6.1.2 ProjectionMatrix
                              1.2.2.6.1.2.1  透视投影矫正,这个要知道吧
                               1.2.2.6.1.2.2  解决Z-bias,使用Reverse Z的投影矩阵要会算吧
                     1.2.2.6.1.3 Transparent.  半透明混合公式,一般都是从后向前渲,从前向后渲怎么设。
                     1.2.2.6.1.4  Rasteration里的黑科技,为什么要这样子算,公式优化,等等,不展开。。源头都是Raytrace.
                      1.2.2.6.1.5 只用DrawPix实现一个软件光栅话,基本上Rasteration就没问题了,剩下的就是去抄Shader,就是个体力活。
        1.2.2.6.2 Raytrace
                     1.2.2.6.2.1  BVH,Octree,KD-Tree自己手撸一个,撸一遍就知道自己哪里没理解了。
                    1.2.2.6.2.2 RayTrace剩下的细节(我也没看懂,就实现了个简单的,不会就是不会);


二 怎么做
按照下图一步一个脚印的写一遍,写不了找UE抄一遍

Cite from GameEngineArchitechure
         就会了,很简单。


纸上学来终觉浅,绝知此事要躬行!!共勉

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
发表于 2021-1-7 09:25 | 显示全部楼层
谢邀。题主的书看的不错,我也很喜欢看书。
从事游戏开发已经13年了,也做过很多年渲染和优化相关的工作,负责过轩辕传奇绝大部分Shader的编写和维护,底层架构的开发和优化。是的图形学是个大坑可以学一辈子。。。
每个人的发展方向都不一样,但我觉得只要热爱游戏热爱编程朝着一个目标不断努力总会做出点什么。对于怎么发展我也有些迷茫并不是顺风顺水,所以这里简单介绍一下我的经历。
凑巧的是我入门图形学也是看了3D游戏编程大师这本书。和楼主类似,大学专业玩游戏没学到什么东西,毕业之后因为喜欢游戏就进了游戏公司主要做一些逻辑开发,锻炼了基本的编程知识,因为认真肯干评价还不错但对图形学完全不了解。
当时一直觉得图形学和我是两个世界,但是因为看了domo启示录对渲染和引擎产生了浓厚的兴趣,也没有人指引所以随便抓了一本3D游戏编程大师就看了起来。看第一遍的时候还不是很懂。但当时工作比较轻松,就看了第二遍,而且照着书写边看,说到底图形学就是一堆数学。这一遍看完基本对渲染的原理有了比较深入的了解,并且也实现了一个软件光栅化的图形引擎。我感觉这本书就像九阴真经九阳真经,是内功,学了这本书之后我还是不了解OpenGL和DX的API,还是没写过Shader。但是在后续的开发过程中我知道了模型和贴图是怎么渲染到屏幕上变成一个个像素的,知道了整个渲染管线的各个阶段,知道了顶点和像素是怎么处理的,在后续的开发中就比一般人看的远了解的深。
这时候刚好又有一家网游公司挖人,也因为我的软件光栅化引擎就顺利跳槽开始做一些优化和渲染相关的工作了,虽然当时的项目还是固定管线的。再积累了一段时间以后,刚好腾讯一个MMORPG项目招图形学相关的人员就去了。。。虽然当时我没写过shader,但是因为对渲染关系比较了解,很快就熟悉并上手了,并且在后面将近5的开发中负责了绝大部分Shader的编写和维护,重写了Gamebryo的渲染底层,使用Ubershader管理生成shader。重新实现了高光,反射,软阴影,景深,后期处理描边,投影贴花,动态模糊,AO,ligtmap等等。另外也做了大量的优化工作,做到当时几万种设备能同屏300人战斗不卡,因为是一款目标二三线用户的网游优化相对更重要一些。这个阶段对渲染还是非常狂热的。
但随着游戏上线也就面临了一些选择,是继续朝渲染引擎方向发展还是朝着产品和游戏开发本身发展呢?渲染是一门非常庞大的学科引擎开发就更不用说了,如果选择渲染和引擎的方向势必花费非常多的时间和精力,很难参与到游戏开发中来。我做渲染和优化这么多年,很多美术策划同事都不熟,很多人也不知道我具体干了些什么,感觉非常独立。这个选择我觉得就像程序发展上选择是专家还是全栈一样,要么朝着渲染和引擎方向一直钻研,要么就在渲染和优化能力达到一定程度之后去研究游戏开发其他各个方面的知识,朝全栈的方向发展。
对我而言促使我进入游戏行业并不断努力至今的还是源自对游戏的热爱,虽然入门晚也不是天才,但因为喜欢所以付出更多的时间和精力走到现在。所以考虑了很久之后还是选择更偏向游戏开发,也去学了更多其他方面的知识,游戏逻辑。AI,物理,UI,服务器等各个模块都有做过,管理和沟通上也在不断学习。这是我选择的方向。
不过个人感觉再好的技术也是呈现在产品之上的,所以不管是继续深入学习渲染还是忘游戏开发方向努力,还是要找对方向努力开发一款成功的产品。
发表于 2021-1-7 09:26 | 显示全部楼层
PSO: 减少状态切换,减少DRIVER CPU 开销。比如 DX9 只能一个 RENDER STATE 一个 RENDER STATE 设置,DX11 把一些 RENDER STATE 绑在一起了比如 DepthStencilState,以提高CPU效率。DX12 你可以理解为捆绑的更多了,同时可以存在硬盘上。
ABuffer: PPLL 的OIT 吧。还是要排序的,在 shader 里排的。TressFX 就用这个,不过现在画头发用 dithered transparency + TXAA 是效率最高的。
Tessellation: 现在其实很常用了,地形,物件(岩石,墙),NVIDIA 的毛。
Deferred shading:最主流了。但是现在主机上带宽的增长不如 GPU ALU 增长的大,而且现在动不动 4K。所以带宽压力大的情况下很多游戏都选择 F+,尤其是标配 60 FPS 的游戏。
GPU 上的内存、寄存器和 GPU 架构有关,AMD 的 GCN 架构现在是主流。你可以看看 Optimizing GPU occupancy and resource usage with large thread groups - GPUOpen。基于GCN优化的文章可以 GOOGLE 找一下。
离线渲染为什么和汇编语言有关系?
主机新的一些特性以后会在 DX12,SM 6.0 里有。
PBR 你看到那些 sampling 去了。。。走学术派可以去折腾,走工程的你看看 EPIC 的那个 real shading in UE4 里关于重要性采样的就可以了,以及Dithering in games – mini series。
procedural terrain 现在做工程基本都是授权第三方工具,自己造轮子的很少。自己引擎上要实现的是 mesh 怎么渲染,材质如果有效渲染(virtual texture 是效率最高的)。
GPU ZEN 就是 GPU PRO 系列,现在改发行方式了所以便宜了。不过GPU PRO 系列里面的文章鱼龙混杂。比较实用的还是 GDC 尤其是 SIGGRAPH 里的一些 presentation。
服务器不懂,不过好像 NVIDIA 就是提供大型计算机并行计算的供应商之一?
BINDLESS RESOURCE 如果普及开来会很好用,很多 GPU PIPELINE 的东西都会普及运用开来,比如结合 DrawIndexedIndirect 搞一些高效渲染。


3D 渲染程序员发展建议:
如果想跟进实时渲染发展趋势,并且想努力应用在产品中,那么:1. 学英文;2. 出国留学(现在国内的经济条件也不用洗盘子了吧);3. 留下来工作。在国内应用程度有限,同时周围能交流的环境也少。
如果还是想实际点,解决近期经济问题,更多关心项目流水,那么不建议折腾图形学。了解商业引擎架构,知道优化引擎执行效率,同时了解联网技术,AI,工具制作等,在国内会更吃香。国内渲染主要靠商业引擎自带特性和美术技巧,对渲染程序的需求很大程度上仅停留在 TA 阶段。
发表于 2021-1-7 09:26 | 显示全部楼层
看到楼主看的书,仿佛看到了当年的自己。基础理论知识应该差不多了,可以研究下unreal和cryengine的渲染流程,同时把实现一些基础效果作为目标,试着实现一个renderer demo,你会发现坑非常多。
比如mesh,terrain,然后你发现物件多了以后,地形大了以后机器就跑不动了,这个时候基本的lod和场景剔除就是你要考虑了,物件多了以后如何合理高效的处理不通的材质也是你要考虑的,light多了以后你就要考虑是否把渲染流程改成deferred的了,但引入dferred以后你又会发现灵活处理各种材质又非常复杂了。当你费了牛劲把water,sky,植被这些放入场景以后,又费了牛劲使用多层shadow map加各种模糊算法勉强搞定了狗牙以后,你会发现为啥画面比cryengine还是差的那么远,这时候就需要考虑postprocess。这时候首先映入你眼帘的估计是hdr,可惜你又费了牛劲移植dx sdk hdr demo的算法发现这玩意根本不能用,因为这里面的tonemap 只是教学用的,根本不实用,然后你又各种找,这个时候你竟然发现了顽皮狗在 神秘海域2就已经实现了filmic tonemap,结果你如获至宝把这一系列神奇的abcdef代入了自己的公式,哇,画面突然变的神奇了。。。然后继续体验ssao,dof,color gradeing,god ray等等的各种坑。。
现在愿意研究渲染本身的人已经不多了,遇到过许多连投影是怎么回事,除w以后x y z取值范围都搞不懂的所谓3d图形程序员。
所以,加油吧,最后强烈推荐一个轻量级但是极其适合阅读和学习的引擎unigine
发表于 2021-1-7 09:35 | 显示全部楼层
我觉得你书看太多了,因此大胆推测你没啥时间动手。
所以,接下来,应该是动手实践,大量地实践。
发表于 2021-1-7 09:44 | 显示全部楼层
哈哈,因为一个学弟的回答,打开了这个问答。
为了回答学弟的问题,把楼主的问题看完了。。说实话,真的是好几次要看走神。
那么多那么多那么多书,方向,专业。闭门看书,没个3到5年,看不完吧。。而且八成看了就忘吧。等看完后忘了咋办,又出新的了咋办,看不懂就跳过么。。那还看个啥。。。
说实话,这些书上学的时候都看过,但是也说实话,大部分都忘完了。
我属于看书看的慢的,平均半年以上才能看完一本。
毕业后进入手机GPU公司,前两年就看了四本书。opengl es2.0 spec,glsl 1.0 spec,egl 1.4 spec,opengl es 3.0 spec。
但是这四本书我都可以背下来了,英文的全部翻译成中文了,里面每个api都被我写成app了,各种用法快写烂了。
毕业第三年用这些知识把cocos引擎源码的核心模块看完了。
毕业第四年开始我就进入游戏公司了,然后看了一本unity shader的书(算是补充一下图形学上层算法,在手机GPU公司,鬼知道什么是bloom。。)。游戏引擎架构这本书我看了一半后停止了,以我当时的水平看,其实意义不大。目前看来最起码还要1年后我才能重读这本书。。
所以,找一个方向,认真认真认认真真看一个系列的书,别的书用到的时候翻翻就行了。
发表于 2021-1-7 09:52 | 显示全部楼层
看到题主说有点想放弃了,同为行外人,图形初心者,野路子选手,同样周围没什么人可以聊这些,一样挣扎着想要入坑的人来鼓励一下题主,顺便讲一下我个人踩过的坑,如果能帮到题主就更好了。


其实就我个人所见,壁垒稍微高一些的东西,自学的话很容易陷入到这种“读了很多书,依旧写不来代码”的情况的,这很正常的,不单是图形,编译、AI这些都一样。所以题主大可不必过于苛求自己搞懂全部理论的东西再去上手撸码,但基本认识还是要有的,我觉得题主在这点上是比不少人强的,所以请放宽心。


然后就是实践的问题,图形这块不像编译原理跟OS那样,有众多公开的比较详尽的course projects作为引导,实时渲染方面的尤其缺。我目前只看到过Game Institute给过一个详细的Game Engine的教程,图形理论到实践手把手,但年代比较久远,使用的还是DX9的固定管线;再有就是Upenn的课程CIS 565,这个就比较前沿,但没那么工程化;然后就是各类业界的分享文章与文集了,这个可以作为自己实践时候的文献参考,如果涉及到simulation,那么有很大可能还要读论文。另外扒CNKI也是一个好方式,大部分CNKI上的硕士论文基本都是有很明确的应用目标的。因此如果实在不知道怎么下刀,可以扒CNKI,而且论文的索引文献也是不错的参考资料。再有就是大厂的培训内容了,知乎上多少都有一点,也可以作为初心者阶段的参考的。


至于我个人踩过的坑么,rasterizer是一定要撸一遍的,不管是full-screen的还是tile-based的,这个东西在知乎有不少相关话题,撸完收益可观;离线渲染的理论也是一定要看的,我个人以为某种程度上实时渲染就是离线渲染的一种trick,所以不能舍本,至少物理模型一定要搞明白;至于引擎方面,我看到有大佬推荐去读UE4的源码,但引擎涉及面太广,而且有不少代码生成的东西,没有足够的经验直接上手难度颇大(不过话说回来,事在人为没有暴力刚不过去的),因此我的办法是先在Github上找一些结构比较清晰的,小一点的个人项目,然后抄、改、换种语言仿写...反正怎么着都行,把rendering path过一遍,看看那些个曾经出现在官方示例里面的例子是怎么集成到一起的(一般情况下,这些都会包含题主提到的deferred rendering,还有包含tiled deferred/forward+的),抄到不懂的就查资料。至于项目怎么找,可以去油管上搜视频点下面作者给出的链接,也可以去Git上自己搜。这一步以后么...应该是看情况,重复几遍,反正最终是要自己弄一个包含主流特性、相对完整的渲染器出来,完了之后可以查一查代码生成的相关资料,自己写材质编辑器(其实这个可以单独搞,懂点编译相关的东西然后去做一个简单的不会太难),最后再去看UE4的代码。至于平台优化那一块,我觉得只有到了实际的工作中才会真正接触到,而且有些东西也确实是有技术壁垒的,但是还是一样,概念得有。


以我当前弱鸡的程度,也只能看到这里了,上面的说那些我自己也在实践中(正在“抄”代码),至少目前它们对我个人而言是有效的。从题主的描述中能感觉到题主对图形是出于真爱,所以还请对自己多自信一些,不必妄自菲薄。另外,国内做 3D 渲染和游戏引擎的码农们都在哪里获取技术信息 以及 像我这种情况,该如何继续学习游戏中实时渲染这方面知识? 下一众大佬的回答应该也能解答题主的一些困惑。


嗯……其实就是一个字“搞”,当然最后想要搞点名堂出来还是得入行。坑自然是大坑,况且这个坑还很有可能是一见误终生那种坑,不过作为一人吃饱的光杆,我的压力比题主要小很多。终究还是生活第一,这个就请题主自己考虑了。


共勉。
发表于 2021-1-7 09:54 | 显示全部楼层
利用这些知识,去找一份大厂的引擎开发的工作吧。
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-9-20 10:57 , Processed in 0.102742 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表