Shader 学习笔记 20160618

星之卡比-机械星球 机械魔方shader思路


CSDN服务器崩了,图片待补。
视频如下
http://pan.baidu.com/s/1i4R97gT


图片说明:
a, 一个box, 自己旋转,然后颜色变换,在最右侧有高光, 然后内部有电路一样的东西似乎在流动。
b, 背后有一个动态光flare
c, 背后有一个多个方块fadeinFadeout效果。


思路一:旋转、动态光flare、背后的多方块fadeinFadeout效果都不是问题。难点是中间的那个光不停变换的怎么做。思路一就是我最开始的想法,通过程序做按照时间或者旋转角度作为输入做pixel控制。但是后来一想,这种方法太笨了,coding过于复杂,并且不利于artist调整。

思路二:使用两个差别比较大的Texture配合lerp()函数,然后配合计算时间(或者cube的旋转角度)做输入,计算pixel。这个approach比之前的好一些,但是还是面对需要做两个Texture,调整lerp的工作,最关键是不够直观。

思路三:其实也不算是思路,因为之后我又看到了一个同样的cube,但是是灰色的,从这个cube可以看到它会出现镜面高光(最右面的面)。我一下子想到了!这是一个典型应用了brdf(或者reflectionCube)做到的高光和颜色控制说白了就是通过输入Viewdir和Normal,算出Reflectdir,然后把Reflectdir归一化到一个texture里面去找点(实际上这个点代表的意思就是光源的color和specular)。找完点(找完光)后再和cube本身的Texture相乘。

操作上有两种:
一种是shader里面直接写反射公式,然后去映射lightTextureMap。这个方式好处在于节省材质大小,但是缺点在于不太方便artist灵活调整。
另外一种就是直接使用reflection cube map做反射控制,简单粗暴,又符合人类直观调整。举例来说,用standardShader实现,可以直接挂一个reflection probe,然后reflection probe上面挂一个reflection cube以便模拟光源。而物体本身则可以通过specular和smooth来决定反射效果。缺点是对象多,资源耗费多,特别是cubemap的资源多(不过可以使用mipmap降低分辨率);另外一个缺点就是Cubemap需要仔细调整,因为在cube旋转的时候,如果cubemap的色彩调整不到位,就会让人感觉cubemap是在反射环境,而不是在shining,从这点上看第一种操作就好,因为可以函数控制,搞成非线性的,直接reflection probe cube的方式就是只能线性的。

猜你喜欢

转载自blog.csdn.net/mconreally/article/details/51705231