.  前几个月,偶然在群里看到有人讨论Unity3D光照,于是我又萌生了一个新的目标————把它抄过来!

.  众所周知,3D渲染的整个流水线都跟光照密不可分,相关的技术更是数不甚数,而2D游戏的光照通常被人忽略,因为2D游戏大多数都是贴图叠加,要什么效果,美术直接画出来就完事了,所以大多数2D游戏引擎就不过是个贴图引擎,干着渲染的工作却没有一点渲染的技术含量。

.  即使是2D游戏,运用好光源也可以把品质提升一个档次,但就如前面所说,做2D引擎的不提供这个功能,用2D引擎的不知道这个技术,以至于大部分有动态光效的2D游戏都是外国货。


.  进入正题,记录一下我花了2个周末实现的2D光源编辑。

效果图

大体思路

先生成光照面积,在后期阶段通过面积全屏采样输出即可,其难点就在于生成光照面积。

光照面积又分内面积和外面积,内面积就是发光的部分,光线不会衰减,外面积则是辐射范围,光线会逐渐衰减,在这个前提下,光照面积还分圆形面积和多边形面积。

圆形面积生成:

通过圆形和半径生成内面积,再通过给定的辐射度生成外面积,这个形状看起来像是一个环,之后再用三角形填充内面积以及环,最终生成的样子是这样的。

多边形面积生成:

通过给定的顶点生成内面积,再通过给定的辐射度生成外面积,思路跟圆形是一样的,但多边形有两个略为棘手的问题。其一是多边形的形状是不可控的,如果是凹多边形,则光照面积会叠加,这会导致叠加的部分被多次光照。其二是多边形并非像圆形一样均匀的形状,想象一下,同一个光源散发出来的光在相同距离的情况下衰减程度应该是一样的,拿圆形光源来说,光从内面积边缘发出,最终抵达外面积边缘,当光线刚发出时(在内面积边缘时)其衰减值为1(最大值),当光线抵达终点后(在外面积边缘时)其衰减值为0(最小值),而圆形是一个均匀的形状,因此它任何角度都满足这一条件,而多边形则需要通过一点点的计算代价来做到这一点。

解决第一点:求得最大凸包即可。

解决第二点,计算外面积的时候,用圆角来代替多边形的锐角。

最终生成的样子是这样的。


最终效果

有线段绘制

无线段绘制

最新文章

  1. SAX与DOM
  2. ThreadLocal解决线程安全问题
  3. 【bzoj1043】下落的圆盘
  4. 剑指Offer:面试题3——二维数组中的查找(java实现)
  5. 函数WideCharToMultiByte() 详解
  6. TM1668 Led 驱动芯片源程序
  7. sendkeys && appactivate
  8. windows安装PHP5.4.13 +Apache2.4.4(转)
  9. python的工作记录B
  10. 关于Jquery.validate.js中动态删除验证remove方法的Bug
  11. Linq to sql 操作
  12. win7下:MySQL-Front的下载与安装
  13. ERP中关于审批时速度太慢的SQL优化
  14. [hihoCoder]矩形判断
  15. Django REST framework基础:解析器和渲染器
  16. java面试题复习(八)
  17. 十二省联考题解 - JLOI2019 题解
  18. Ambient Light
  19. ngrep命令用法
  20. android编译错误“OnClickListener cannot be resolved to a type”

热门文章

  1. 解决行内块元素(inline-block)之间的空格或空白问题
  2. ArchLinux安(重)装指南
  3. Ansible常用模块基本操作
  4. PHP 正则表达式的简单应用以 preg_match_all 抓取HTML元素为例 [转载]
  5. 经典案例复盘——运维专家讲述如何实现K8S落地(摘抄)
  6. 你应该知道的简单易用的CSS技巧
  7. [Tricks] 为文件夹右键菜单增加 【使用VS Code 打开】
  8. Kafka0.11之RoundRobinPartitioner/HashPartitioner(Scala):
  9. QCustomPlot 基础
  10. 基于.Net core3.0 开发的斗图小程序后端+斗图小程序