我发现了Unity3D的2D Light Renderer, 随后就把它抄了过来
. 前几个月,偶然在群里看到有人讨论Unity3D光照,于是我又萌生了一个新的目标————把它抄过来!
. 众所周知,3D渲染的整个流水线都跟光照密不可分,相关的技术更是数不甚数,而2D游戏的光照通常被人忽略,因为2D游戏大多数都是贴图叠加,要什么效果,美术直接画出来就完事了,所以大多数2D游戏引擎就不过是个贴图引擎,干着渲染的工作却没有一点渲染的技术含量。
. 即使是2D游戏,运用好光源也可以把品质提升一个档次,但就如前面所说,做2D引擎的不提供这个功能,用2D引擎的不知道这个技术,以至于大部分有动态光效的2D游戏都是外国货。
. 进入正题,记录一下我花了2个周末实现的2D光源编辑。
效果图

大体思路
先生成光照面积,在后期阶段通过面积全屏采样输出即可,其难点就在于生成光照面积。
光照面积又分内面积和外面积,内面积就是发光的部分,光线不会衰减,外面积则是辐射范围,光线会逐渐衰减,在这个前提下,光照面积还分圆形面积和多边形面积。
圆形面积生成:
通过圆形和半径生成内面积,再通过给定的辐射度生成外面积,这个形状看起来像是一个环,之后再用三角形填充内面积以及环,最终生成的样子是这样的。

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



最终效果
有线段绘制

无线段绘制

我发现了Unity3D的2D Light Renderer, 随后就把它抄了过来的更多相关文章
- 时光煮雨 Unity3D实现2D人物移动-总结篇
系列目录 [Unity3D基础]让物体动起来①--基于UGUI的鼠标点击移动 [Unity3D基础]让物体动起来②--UGUI鼠标点击逐帧移动 时光煮雨 Unity3D让物体动起来③—UGUI DoT ...
- 时光煮雨 Unity3D实现2D人物动画② Unity2D 动画系统&资源效率
系列目录 [Unity3D基础]让物体动起来①--基于UGUI的鼠标点击移动 [Unity3D基础]让物体动起来②--UGUI鼠标点击逐帧移动 时光煮雨 Unity3D让物体动起来③—UGUI DoT ...
- 时光煮雨 Unity3D实现2D人物动画① UGUI&Native2D序列帧动画
系列目录 [Unity3D基础]让物体动起来①--基于UGUI的鼠标点击移动 [Unity3D基础]让物体动起来②--UGUI鼠标点击逐帧移动 时光煮雨 Unity3D让物体动起来③—UGUI DoT ...
- 偶然发现的Unity3d,两点之间的距离计算。
无意间查了一下Vector3的API,发现了一个方法. magnitude Returen the length of vector(Read Only). 然后就试了一下这个方法. Vector3 ...
- Unity3D 之2D动画机
这里来讲解一下2D动画机的使用 2D的时候,默认的情况下,可以调用默认的站立之类的动画,然后通过触发,可以变化自己的动画. 一:将一个图切成一些一个元素 二:创建一个精灵,给精灵添加一个动画机 三:给 ...
- 强大的游戏开发工具Unity3D推出2D开发工具,unity将混合3D与2D开发
2013 Unity全球开发者大会(Unite 2013)于2013年8月28日在温哥华隆重开幕,会上Unity全球CEO David Helgason在Keynote上宣布Unity 4.3版本即将 ...
- 【日常记录】【unity3d】 2D跳跃过快导致角色某帧陷入地面
如果角色运动过快会导致嵌入地面再反弹出来 : 可以使用更高质量的检测方式 "Continuous" :就可以解决这个问题
- Unity3D初学之2D动画制
作者:Alex Rose Unity最近宣布推出额外的2D游戏支持,添加了Box 2D物理和一个精灵管理器. 但这里还是有些技巧需要牢记在心.逐帧更改图像只是动画制作的冰山一角,若要让你的游戏出色运行 ...
- Unity3D重要知识点
数据结构和算法很重要!图形学也很重要!大的游戏公司很看重个人基础,综合能力小公司看你实际工作能力,看你的Demo. 1.什么是渲染管道? 是指在显示器上为了显示出图像而经过的一系列必要操作. 渲染管道 ...
随机推荐
- Redis数据库之编程项目及练习资源
实训项目 : NOSQL数据库设计与应用实训 注释: Redis数据库编程项目示例及练习资源 项目源码获取: https://pan.baidu.com/s/19f0F7cmx ...
- 死磕 java同步系列之mysql分布式锁
问题 (1)什么是分布式锁? (2)为什么需要分布式锁? (3)mysql如何实现分布式锁? (4)mysql分布式锁的优点和缺点? 简介 随着并发量的不断增加,单机的服务迟早要向多节点或者微服务进化 ...
- SLES15SP1 AutoYast - PXE 技术
由于最近在做几个Ceph项目,基本都是50个节点起,那我们在项目中经常使用PXE技术来实现系统自动化安装,提高效率,可能有会说PXE技术太老了没什么好了解,但我觉得的很实用,尤其在项目型工程中,通过P ...
- 手把手教你如何在Windows下allure与jenkins的集成生成让你一见钟情的测试报告 - 03(非常详细,非常实用)
简介 好了,国庆假期结束,开始搬砖.为什么要把allure和jenkins集成了?原因是集成以后,我们就可以直接查看allure的结果,不需要重复输入命令.重复使用浏览器打开文件来查看allure的结 ...
- Spark 学习笔记之 共享变量
共享变量: 共享变量通常情况下,当向Spark操作(如map,reduce)传递一个函数时,它会在一个远程集群节点上执行,它会使用函数中所有变量的副本.这些变量被复制到所有的机器上,远程机器上并没有被 ...
- 快学Scala 第十课 (包和包对象)
Scala包定义: 嵌套式: package a1 { class a1Class{ val age = 10 } package a2 { class PackageTest { def main( ...
- Java8 Lambda表达式详解手册及实例
先贩卖一下焦虑,Java8发于2014年3月18日,距离现在已经快6年了,如果你对Java8的新特性还没有应用,甚至还一无所知,那你真得关注公众号"程序新视界",好好系列的学习一下 ...
- Egret资源跨域问题
在服务器上配置了允许跨域还不够,还需要在引擎配置允许跨域,不然texture无法在webgl上下文中渲染 会报一个类似于The cross-origin image at 的错误, 只需要在egret ...
- Linux-rhel-server-7.4-Mysql-5.7安装记录
解压下载的tar包: tar -xf mysql-5.7.19-1.el7.x86_64.rpm-bundle.tar 安装一下rpm包: sudo rpm -ivh mysql-community- ...
- Docker学习1-CentOS 7安装Docker
前言 docker 是一个开源的应用容器引擎,基于 Go语言 并遵从Apache2.0协议开源. docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发布到任何流行的 ...