Category: Devlogs

Bump Noise Cloud – 3D噪点+GPU instancing制作基于模型的体积云

用3D噪点贴图,配合GPU instancing将模型沿着法线挤压渲染多层,制作类似《sky光遇》里的的体积云。 最近上线的《sky光遇》里的体积云做的很赞,忍不住想尝试做做看。试了很多不同的做法,一开始想到的就是比较流行的Ray marching。但是光线步进一般的做法是代码算出几何体形状和坐标,然后依赖3D噪点图的随机形状,不能自由的用模型捏云的造型。所以转向用一个比较“土”的方式来做。 最终效果: H5...

《塞尔达-荒野之息》中角色受多个点光源影响的做法

收集多个点光源的坐标和颜色等信息传递给Shader,在Shader中用循环函数计算出点光源的光照。 先看看《荒野之息》的实际效果: 图中1,2,3处的点光源都会对主角和NPC产生影响。 《荒野之息》可以支持很多点光源。但Unity的光照系统只支持4盏动态点光源,所以不能用Unity的点光源,必须自己另外实现一套。 因为是用点卡通渲染,不追求真实光照,所以可以用讨巧的方式。做法就是用代码将多个点光源相对于物体的角度,距离和颜色传递到shader里。然后在shader中做循环运算。 我一开始尝试的做法是:先在C#里收集角色坐标和所有点光源的坐标和颜色信息,然后计算粗出点光源相对于角色的角度“LightDir”和他们之间的距离,最后把这些参数一起传递给Shader。...

PBR Lego Shading – 基于PBR的偏风格化的乐高材质

采用PBR的思路,用自定义的光照系统制作《乐高大电影》那种偏欧美浓艳色调的风格化的乐高材质。 首先我找了挺多现有的乐高作品的画面参考图。有游戏的,玩具官宣图的,也有近几年的乐高大电影的。可以看出风格是在一步步进化的。 乐高游戏的画面渲染质感普遍很单一,角色基本都是PBR-Specular这一套,场景也是写实风格的PBR风格。但缺点也很明显,完全写实的PBR会有点脏脏的,特别是灯光暗的地方全是黑色,没有动画电影那种可爱舒服的色调。感觉这些老美开发者也不太考究卡通色调的风格,基本就是把乐高当作《Call of Duty》系列的写实画风在做。 而乐高玩具的官宣图跟乐高官方的大电影系列现在都明显偏向了主流的欧美卡通渲染方向,并不是一味追求写实材质的。而且场景打光很厉害,颜色比较浓艳,整体气氛烘托得很好。...

Simple Subsurface Scatterting for Mobile – (一)通透材质的次表面散射

基于平行光角度或者点光源位置的通透材质的次表面散射的做法。性能开销小,可支持移动端。 通透材质,例如玉器,玻璃,牛奶等,因为透光性比较强,所以次表面散射主要来自于背后透射光源的影响。 先说说主平行光源下的做法: 直接把主光源方向反转,让主光源从后方照亮物体。 物体的法线方向乘以一个背后透射光源的影响系数“_SubsurfaceDistortion”。 核心代码:...

代码自动创建AnimatorController和动画测试环境

用所选动画一键创建Animator Controller,并且搭建好动画测试环境,添加测试动画的UI按钮。 手动创建Animator挺费事的,特别是反复修改动画再倒入Unity里测试的时候。我当前参与的项目用的Live2D做纸片人动画,做的AnimatorController只是把所有的AnimationClip分别填再一个State里,然后都是创建AnyState的Transition。如下图。 规则很简单,所以很容易用代码创建。 代码如下: 这样在unity主菜单里就可以直接点按钮执行这个方法了。...

Sparkle Shader – 闪烁亮片材质

两种方法用躁点图配合Bloom后期效果做出闪烁亮片材质。 闪耀亮片的基本原理很简单:做法就是用一张躁点图,做pow运算,让少数躁点亮度提高,配合post-processing中的bloom效果,让少数躁点亮爆。 但其实具体做各种材质的时候,有很多不同的手段可以实现亮片效果。 方式一:在fragment阶段做normalDir躁点扰动。 做法就是用一张彩色Noise贴图,在fragment阶段将normalDir干扰。然后与viewDir或者lightDir做dot运算(受视点影响或者光源影响),最后再做一次Pow运算。 如下图,基于视点的亮片,所以中间亮片较大,边缘的亮片较小。...

Liquid Bottle – 液体瓶制作

通过旋转posWorld获得X和Z轴偏移,配合脚本输入Sin曲线制作出自然晃动的瓶装液体效果,并且可调整液体容量。 这个巧妙的做法是从网上学来的,不过这位大佬并没有详细分析实现方式,只是写了一下大概的思路,看他的twitter里很多人都在追问详细做法思路。我这儿就厚着脸皮拿来详细分析一下吧。 这玩意儿的实现方式很讨巧,几个功能的实现是依赖同一个算法的,不知道从哪儿讲起比较合适。所以就从实现的流程一步步讲: 准备好一个胶囊体来当作药水瓶。 首先计算一个物体位移和旋转时的加速度值,用来作为液体晃动的参数。创建一个C#脚本,把对象的位移和旋转的delta值输入sin函数,获得一个在-1到+1之间的平滑曲线。我们主要关注物体的X轴和Z轴的运动影响,所以就把“_WobbleX”和“_WobbleZ”这两个值输入进后面要写的shader里。 参考代码:...