.  前几个月,偶然在群里看到有人讨论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. impala对元数据的界面更新操作

    执行 impala-shell 即能进入界面操作sql.如果在hive更新了数据之后,而在impala中却无法看到更新后的数据的话,意味着impala里元数据信息还没有刷新,此时在impala操作界面 ...

  2. hbase配置-集群无法启动问题

    root@cslave2:/]#jps 2834 NodeManager 2487 DataNode 12282 Jps 2415 QuorumPeerMain root@cslave2:/]#sud ...

  3. 从SpringMVC获取用户信息谈起

    Github地址:https://github.com/andyslin/spring-ext 编译.运行环境:JDK 8 + Maven 3 + IDEA + Lombok spring-boot: ...

  4. Java 提取Word中的文本和图片

    本文将介绍通过Java来提取或读取Word文档中文本和图片的方法.这里提取文本和图片包括同时提取文档正文当中以及页眉.页脚中的的文本和图片. 使用工具:Free Spire.Doc for Java ...

  5. java ThreadLocal使用

    1.源码分析 此处以JDK1.8版本分析 1.1 set方法 /** * Sets the current thread's copy of this thread-local variable * ...

  6. vimrc配置文件

    目录 vimrc配置文件 参考 主要功能 使用方法 配置文件 文件下载 vimrc配置文件

  7. HDU 2044——一只小蜜蜂...(DP)

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=2044 题解 //递归思想,超时 #include<iostream> using namesp ...

  8. vue.js入门代码

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  9. Kafka 学习笔记之 High Level Consumer相关参数

    High Level Consumer相关参数 自动管理offset auto.commit.enable = true auto.commit.interval.ms = 60*1000 手动管理o ...

  10. Open Source v.s. Open Core

    摘要 本文翻译自 CMSWire 网站的<Open Source vs. Open Core: What's the Difference?>,主要介绍 Open Source 和 Ope ...