由于看了两天的Unite大会的视频,(顺便安利:https://www.youtube.com/watch?v=fZfPv-oxO7U, 连续9小时的ECS介绍,看到高潮),以及对FlowCanvas和NodeCanvas两个插件的尝试,本周的实质进展很少,只有Tile的引入,第一版游戏是有Tile的,是代表"一格"的对象,后来在ECS化改造时因为一直用不上就没做,但是现在要进行所有格子的植物生长相关计算了,所以又需要用到了.一个Tile会引用此格范围内的所有设施,并且自身会具有温度,湿度,光照度等等数据,在各个气候系统中定时刷新,然后用于作物生长,角色舒适度检查等等.
那么这周没有什么太多的实质进度的话,我正好来仔细说说之前自己觉得还比较有特色的麦子的shader吧,首先看下实现效果,一块麦田在白天和夜间的画面表现分别是这样的:
白天
黄昏到夜间
夜间
这里主要有4个重要的技术细节,首先是卡通风格,然后是夜间光圈的三层化,夜间的表面凹凸感,最后是动态的草浪.我想分4次讲完.(当然还有一个重要的大问题就是如何像素化,因为我这个游戏是一个用3d模拟2d像素化的游戏,不过那又是另一个话题了)
要说明的是,因为我对shader的学习也是最近的事情,我相信我的shader代码中有很明显的小学生迹象,效率上也未必很好,只能说效果我自己挺满意的,然后希望能够得到更多学习shader的朋友的指正.
卡通风格
'卡通风格'这个表述可能太宽泛,我实际的目的就是想要模拟出有动画片里的颜色比较单纯的感觉. 这个单纯我首先想到的就是消除现实里不同面的明暗区别.
先看一下麦田的模型吧:
非常简单,总共只有17个面,一个方盒子在y方向上分了三段,然后方盒子顶端加了一圈面,仅此而已.
同时在这张图中还可以看出来使用默认材质时,不同面因为受光强度不同,颜色深浅不同.如果此时直接上贴图的话是什么样呢?
嗯,我直接给出了游戏中的表现,这样显然是不行的,模型的方形结构一览无余, 所以首先就是要把光照强度的区别给去掉.
这里直接上代码了,在frag方法中,常规的光照模型中(Phong, Blinn?有点担心这边会说错,不过书不在手边,回家去查),在计算光照强度时,是使用光照方向矢量与表面法线方向矢量的点乘.但是我直接无视掉表面法线而统一使用一个朝上的矢量.这样就抹消了不同面的光照强度的不同.看一下这个shader的效果是这样的:
嗯,现在就是个毫不起眼的白盒子了,然后给上贴图并且关闭线框的显示:
嗯,感觉不错,看一下游戏视角中的样子:
嗯,对模型结构隐藏的不错,感觉蛮2d像素化,也蛮像是一丛很茂盛的麦子的样子(自夸).对了再看一下贴图:
嗯贴图就是这么简单,另外你也许会说,这不就是不考虑光照的默认unlit shader的效果么,其实不是的,因为我不能真的不考虑光照,在前面最开始的日夜交替的gif中能看到,不同强度的光照是要有影响的,那么如果不用我那个假法线,直接去乘光照强度怎么样?嗯,这样也是可以的,但是我当时有一个想法,我希望在黄昏时,当太阳移动到与地平线很近的时候,场景能够也像很多动画场景一样,泛起橙色的光芒,这样的话我就确实需要法线计算了,外加上光源的调整之后的黄昏效果就是最上面第二图的样子了.单看这丛麦子感觉不太明显,等到我的场景更为丰富一些再贴一个更大一些场景的黄昏效果.
那么在整个shader的书写中,还有很多别的问题比如半透明抠除, 比如环境光叠加,因为这些都是常规操作,我就没有细讲了.有兴趣的话超级推荐这本<Unity Shader 入门精要>,乐乐小姐姐讲的深入浅出,全本都是干货,是国产教程书中非常难得的.
那么这次就这样,过段时间我再继续下一部分.
作为自学unity的萌新膜拜大佬,期待dalao的游戏发布。