我发现了Unity3D的2D Light Renderer, 随后就把它抄了过来
2019-11-18杂谈搜奇网45°c
A+ A-. 前几个月,有时在群里看到有人议论Unity3D光照,因而我又萌生了一个新的目的————把它抄过来!
. 尽人皆知,3D衬着的全部流水线都跟光照密不可分,相干的手艺更是数不甚数,而2D游戏的光照一般被人疏忽,由于2D游戏大多数都是贴图叠加,要什么结果,美术直接画出来就完事了,所以大多数2D游戏引擎就不过是个贴图引擎,干着衬着的事情却没有一点衬着的手艺含量。
. 即使是2D游戏,运用好光源也能够把质量提拔一个层次,但就如前面所说,做2D引擎的不供应这个功用,用2D引擎的不知道这个手艺,以至于大部份有动态光效的2D游戏都是外国货。
. 进入正题,纪录一下我花了2个周末完成的2D光源编辑。
结果图
大致思绪
先生成光照面积,在后期阶段经由过程面积全屏采样输出即可,其难点就在于生成光照面积。
光照面积又分内面积和外面积,内面积就是发光的部份,光芒不会衰减,外面积则是辐射局限,光芒会逐步衰减,在这个前提下,光照面积还分圆形面积和多边形面积。
圆形面积生成:
经由过程圆形和半径生成内面积,再经由过程给定的辐射度生成外面积,这个外形看起来像是一个环,以后再用三角形添补内面积以及环,终究生成的模样是如许的。
多边形面积生成:
经由过程给定的极点生成内面积,再经由过程给定的辐射度生成外面积,思绪跟圆形是一样的,但多边形有两个略为辣手的题目。其一是多边形的外形是不可控的,如果是凹多边形,则光照面积会叠加,这会致使叠加的部份被屡次光照。其二是多边形并不是像圆形一样匀称的外形,设想一下,同一个光源披发出来的光在雷同间隔的情况下衰减水平应该是一样的,拿圆形光源来讲,光从内面积边沿发出,终究到达外面积边沿,当光芒刚发出时(在内面积边沿时)其衰减值为1(最大值),当光芒到达尽头后(在外面积边沿时)其衰减值为0(最小值),而圆形是一个匀称的外形,因而它任何角度都满足这一前提,而多边形则须要经由过程一点点的盘算价值来做到这一点。
处理第一点:求得最大凸包即可。
处理第二点,盘算外面积的时刻,用圆角来替代多边形的锐角。
终究生成的模样是如许的。
终究结果
有线段绘制
无线段绘制
Github传送门