首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >一种二维阴影算法

一种二维阴影算法
EN

Stack Overflow用户
提问于 2013-01-15 06:35:17
回答 2查看 702关注 0票数 3

我正计划做一个游戏,利用光线(和阴影)作为游戏的一部分,但是我不能想出一个有效的算法来实现它们,我相信会有一个优雅的解决方案。

白色区域直接由光照明,浅灰色区域由直接照明的墙壁照明,深灰色区域为黑暗。

我希望以一种有效的方式找到这些领域。(实时,光线可以移动)

虽然不现实,但这是我能想到的最简单的方法,任何其他包括直射光和反射光的实现都是受欢迎的。

..。

我的第一个尝试是从光线到屏幕的周边绘制线条,并找到它们相交的第一面墙。但是对墙的每个照明部分重复这个算法来标记“环境”光是不可行的。

还请注意,游戏是在Flash中,所以我不认为我可以利用gpu。

EN

回答 2

Stack Overflow用户

发布于 2013-01-16 09:22:29

受Ryan回答的启发。

在二维网格中,将屏幕上的每个点标记为已亮。然后,对于屏幕上的每一面墙(按照与点的距离顺序),在它们后面绘制一个阴影,如下所示:

在走到下一面墙之前,首先检查它的哪些部分是亮的,哪些是不亮的,以免绘制两次阴影。标记为下一步绘制阴影的所有墙,因为这些墙可能是亮的墙。(我们应该在下一部分之前再检查一遍)

对于每个亮起的线段(墙),首先检查是否有墙与该线段相交。对于每个交叉点,在交叉点处将照明线段拆分为2部分。

对于每个线段的端点,重复临时阵列中的第一部分,并在末尾将所有亮点添加到最终阵列中。

第一部分应该遍历屏幕上的所有点和墙上的所有点一次。因此O(墙的area+length),并且根据场景的复杂性(墙的数量和兴趣),第二部分应该应用第一部分大约20次。

这可能会实时工作,但请确保在灯光不移动时存储照明区域。

票数 2
EN

Stack Overflow用户

发布于 2013-01-15 07:06:35

你不需要画所有的亮线,只需要画重要的线。例如,对于一个点光源和一条线,您只需要求解两个交点。

对于反射照明,应从强度为n的点光源开始,然后每次此灯光与墙相交时,将墙拆分为较小的线段,并在照亮的线段上添加强度为n-1的线性光源。你可以想做多少次就做多少次。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14328030

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档