Tag: Shader

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

收集多个点光源的坐标和颜色等信息传递给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》系列的写实画风在做。 而乐高玩具的官宣图跟乐高官方的大电影系列现在都明显偏向了主流的欧美卡通渲染方向,并不是一味追求写实材质的。而且场景打光很厉害,颜色比较浓艳,整体气氛烘托得很好。...

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里。 参考代码:...

Foliage Rendering – 树叶体积感渲染(一)

通过修改法线的方式,制作出有自然柔和的体积感,并且跟随光影方向变化的树叶。 树叶的做法无非是插片,但是不管怎么插片,在平行光源下都不自然不好看,阴影边缘硬邦邦的。 我们想要的是有体块感的树叶。有个很简单出效果的方式就是把树叶的法线映射成球形的,因为我们最终想要的体块感很接近一个球形。 修改完法线后,就能360度无死角的显示出柔和的体块感。 配上贴图,把光源转几个方向看看,很完美。 实现球体Normal除了用修改法线的方式,还可以直接在Shader里通过物体Pivot计算出来,详细可参考第二篇:Foliage...

Volumetric Clouds – 体积云的做法

巧妙利用unity提供的Graphics.DrawMesh方法,配合基于uv偏移产生的立体光影效果,制作体积云。 这个Volumetric Cloud的做法简单来说,就是利用Graphics.DrawMesh的方法,将一个平面mesh垂直绘制n次,获得一个类似“千层糕”的立体结构。然后通过shader配合制作出云层的光影和飘动的变化效果。 首先简单介绍一下Unity提供的Graphics.DrawMesh方法: DrawMesh可以在一帧里把一个Mesh绘制一次。这个Mesh可以接受或产生光影。可以被一个或多个Camera绘制。而且注意他并不是立即执行绘制的,他只是把绘制需求提交给渲染中心去处理,所以它不是实时执行的。这玩意儿适合用来绘制数量庞大,但没有交互需求的对象,例如游戏中无关紧要的远景。 可参考Unity官方文档:https://docs.unity3d.com/ScriptReference/Graphics.DrawMesh.html...

Dynamic Grass – 动态草地制作

制作随风摇摆的草地,并且草碰到障碍物会弯折。  先看看Demo效果: 自定义草皮尺寸。 调整风向风速,对草皮的影响效果。  Unity发布的webGL不支持复杂For循环语句的shader,所以上图demo里只有主角跟草有交互。实际上可以多个对象跟草交互的。而且webGL里也不支持ShadowCaster,所以影子也无法显示。其他主流平台都是可以正常运行的。  ...