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

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

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


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

效果图

大体思路

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

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

圆形面积生成:

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

多边形面积生成:

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

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

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

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


最终效果

有线段绘制

无线段绘制

我发现了Unity3D的2D Light Renderer, 随后就把它抄了过来的更多相关文章

  1. 时光煮雨 Unity3D实现2D人物移动-总结篇

    系列目录 [Unity3D基础]让物体动起来①--基于UGUI的鼠标点击移动 [Unity3D基础]让物体动起来②--UGUI鼠标点击逐帧移动 时光煮雨 Unity3D让物体动起来③—UGUI DoT ...

  2. 时光煮雨 Unity3D实现2D人物动画② Unity2D 动画系统&资源效率

    系列目录 [Unity3D基础]让物体动起来①--基于UGUI的鼠标点击移动 [Unity3D基础]让物体动起来②--UGUI鼠标点击逐帧移动 时光煮雨 Unity3D让物体动起来③—UGUI DoT ...

  3. 时光煮雨 Unity3D实现2D人物动画① UGUI&Native2D序列帧动画

    系列目录 [Unity3D基础]让物体动起来①--基于UGUI的鼠标点击移动 [Unity3D基础]让物体动起来②--UGUI鼠标点击逐帧移动 时光煮雨 Unity3D让物体动起来③—UGUI DoT ...

  4. 偶然发现的Unity3d,两点之间的距离计算。

    无意间查了一下Vector3的API,发现了一个方法. magnitude  Returen the length of vector(Read Only). 然后就试了一下这个方法. Vector3 ...

  5. Unity3D 之2D动画机

    这里来讲解一下2D动画机的使用 2D的时候,默认的情况下,可以调用默认的站立之类的动画,然后通过触发,可以变化自己的动画. 一:将一个图切成一些一个元素 二:创建一个精灵,给精灵添加一个动画机 三:给 ...

  6. 强大的游戏开发工具Unity3D推出2D开发工具,unity将混合3D与2D开发

    2013 Unity全球开发者大会(Unite 2013)于2013年8月28日在温哥华隆重开幕,会上Unity全球CEO David Helgason在Keynote上宣布Unity 4.3版本即将 ...

  7. 【日常记录】【unity3d】 2D跳跃过快导致角色某帧陷入地面

    如果角色运动过快会导致嵌入地面再反弹出来 : 可以使用更高质量的检测方式 "Continuous" :就可以解决这个问题

  8. Unity3D初学之2D动画制

    作者:Alex Rose Unity最近宣布推出额外的2D游戏支持,添加了Box 2D物理和一个精灵管理器. 但这里还是有些技巧需要牢记在心.逐帧更改图像只是动画制作的冰山一角,若要让你的游戏出色运行 ...

  9. Unity3D重要知识点

    数据结构和算法很重要!图形学也很重要!大的游戏公司很看重个人基础,综合能力小公司看你实际工作能力,看你的Demo. 1.什么是渲染管道? 是指在显示器上为了显示出图像而经过的一系列必要操作. 渲染管道 ...

随机推荐

  1. redis分布式锁-自动超时锁(在用)

    1.加锁代码结构 2.解锁代码结构 3.java实例 4.测试类 5.测试日志 加锁代码结构 def acquire_lock_with_timeout(conn,lockname,acquire_t ...

  2. 阿里云服务器CentOS6.9安装Ant

    下载地址:http://mirrors.hust.edu.cn/apache/ant/binaries/ 1.下载 2.上传到服务器(非root用户下) 3.解压移动目录(root用户下) tar - ...

  3. Angular7 HttpClient处理多个请求

    1. MergeMap - 串联请求 后一个请求需要前一个请求的返回结果时,需要使用串联请求. 可以使用MergeMap实现, 优势是减少嵌套,优化代码: 代码如下: import {HttpClie ...

  4. 洛谷:P3950 部落冲突

    原题地址:https://www.luogu.org/problemnew/show/P3950 题目简述 给定一棵树,每次给定一个操作,有如下两种: 将某条边染黑 2.询问给定的u,v两点间是否有边 ...

  5. Unknown column 'user_id' in 'where clause'

    mapper位置报错Unknown column 'user_id' in 'where clause' 可能是数据库中的字段user_id包含空格

  6. Unity动态改变物体遮挡关系

    在动态创建物体时,通常同父级下先创建的子物体会被后创建的遮挡,此时就需要我们用代码改变对象的层级. GameObject go;go.transform.SetAsLastSibling();//设置 ...

  7. Java自动化测试框架-02 - TestNG之理论实践 - 纸上得来终觉浅,绝知此事要躬行(详细教程)

    理论 TestNG,即Testing, NextGeneration,下一代测试技术,是一套根据JUnit 和NUnit思想而构建的利用注释来强化测试功能的一个测试框架,即可以用来做单元测试,也可以用 ...

  8. 从零起步 系统入门Python爬虫工程师 ✌✌

    从零起步 系统入门Python爬虫工程师 (一个人学习或许会很枯燥,但是寻找更多志同道合的朋友一起,学习将会变得更加有意义✌✌) 大数据时代,python爬虫工程师人才猛增,本课程专为爬虫工程师打造, ...

  9. SystemVerilog Assertion 设计、调试、测试总结(2)

    上一篇博客主要写了SVA的基本语法(详细),这一篇主要写SVA语法总结,以及如何查看SVA波形等. 断言assertion被放在verilog设计中,方便在仿真时查看异常情况.当异常出现时,断言会报警 ...

  10. Java8两大特性(一)——Stream

    什么是Stream? Stream(流)是一个来自数据源的元素队列并且支持聚合操作,元素流在管道中经过中间操作,最终操作得到结果. 数据源:集合,数组,I/O channel,产生器generator ...