入门图形学:平直着色和平滑着色

       真是在老家关得有点郁闷了,不晓得这疫情什么时候结束。虽然我个人非常喜欢放假,因为有更多时间学习、玩游戏和搞自己的事情。不过这次疫情时间掐得太准了,刚好是放年假回老家拜年的时间,直接把我关在老家四十天,手上除了一台低配笔记本外什么都没有,每天最多的事情就是看下pdf和电影(笔记本屏幕又小、独显也没有、cpu也不行、项目也跑不动、游戏也不能玩)。

       不过最近发现一个好玩的建模利器blender,支持桌面全平台,运行配置要求也低(当然不包括使用cycles渲染器),同时安装包体积小(只有不到100mb),功能强大,开源且免费,我学了一周,感觉这个软件很完美,很多指标比3dmax/maya更好一些(特别是在商业权益方面),我是马上就喜欢上了blender,顺便想安利一下。

       在blender和unity协作之间,涉及了fbx导出导入的问题(当然所有建模软件都要经历这个问题)。

       在blender中渲染有两个关键参数:平直着色光滑着色

       先看看wiki上的解释:着色方式

       平直着色核心:假设组成网格的三角面都是平面,且同一个三角面上任意一个法向量都相同。先在每个三角面上挑选一个点计算颜色(通常是三角面拓扑关系的第一个顶点,也可以选择几何中心),则三角面上其余顶点直接赋予该顶点颜色。所以,使用平直着色法的每个三角面都是统一的颜色,和最近邻差值效果类似。

       这也好理解,网格是由顶点和面构成的,而光照计算很重要的参数就是顶点法向量和顶点朝光源向量。所以平直着色造成光照渲染效果如下:

      

       一种low polygen的风格,这里抬杠一下:我直接曲面细分无数次再球形化,达到纯球效果,我pc四路rtx2080ti。

      

       反正我的笔记本是卡爆了,而且这种细分做法,已经在gpu动态曲面细分中实现了,没必再经过cpu内存中提交到gpu。

       光滑着色核心:得到网格三角面的每个顶点法向量,用光照模型计算每个顶点的光照颜色,然后使用线性插值处理得到三角面上每个像素的颜色,所以得到平滑渐变效果。

       blender的光滑着色效果。

      

       右边看得出来顶点数量没有增加。

       同时unity中默认着色也是平滑着色。

      

       这里做个测试,blender分别用光滑着色和平直着色导出两个sphere到unity使用默认渲染:

      

       看得出来blender中设置平直和光滑着色直接影响到unity中渲染效果,哪怕使用的同样的shader。

       当然我们之前写了很多次shader渲染效果,知道unity渲染管线的默认着色方式是平滑着色,所以一个三角面的包含的片段颜色,是由顶点颜色线性插值出来的。

       而平直着色,我目前使用两种方式达到效果:

       1.通过geometry shader,将每个三角面单独提取出来进行单顶点光照取色,将三角面渲染成单一颜色,这种增加了geometry函数计算,当然渲染效率会降低。

       2.在cpu几何阶段将网格三角面“断裂分离”,我们知道光滑着色就是顶点之间光照颜色插值,那么我们“断裂”三角面之间的顶点,则“阻断”了这种插值处理过程,“模拟”出平直着色效果。不过这种运行效率更低,因为几何数据增加了,例如blender导出的sphere,平直着色的几何数据明显增加很多。

      

       最后如果我们继续深入学习图形学,直到能写自己的渲染管线,那么我们可以定制渲染管线,直接从最底层入手,写一套“新”的渲染管线,直接剔除光照颜色插值过程,修改逐顶点计算成只计算三角面第一个顶点光照等等,这样的话我们不仅达到了平直着色的效果,而且优化了gpu运行效率。

        btw,如果你玩一些很老的游戏,会发现“古老”的渲染管线是没有光滑着色,都是平直着色,因为历史硬件环境原因,所以说平直着色渲染管线相反还是“老前辈”,我们使用平直效果算是“真复古”了。

      

 

      

 

Guess you like

Origin blog.csdn.net/yinhun2012/article/details/104713435