webGL / openGL中多个2D点光源的最佳性能方法? [动态灯]

时间:2014-04-09 15:02:10

标签: canvas opengl-es opengl-es-2.0 webgl

我正在开发一款基本上是快速变化的2D场景的游戏,其中一些点光源(每种都可以有自己的颜色)放置在屏幕上,也可以继续前进每个框架都有自己的

首先让我先介绍一下今天早些时候在纸上写下的一些情况:

Different kind of point light situations

最终产品应该如图4所示。我的问题归结为: 您会选择哪种实施方式,以及为什么会这样做。

  • 需要多少个着色器程序,有哪些资源和资源?有多大(质地?VBO?)
  • 有多少上下文切换(程序更改,其他制服,......)

我目前的做法是拥有光线所在的纹理和不存在光线的纹理。这将在每个帧的开始处呈现,但仅在下一帧上使用。所以Light总是会让1帧落后,这可能看起来很好看。在正常渲染对象(例如蓝色矩形)期间,我将在片段着色器中查找光纹理,并将该值与对象组合。

但是,我看到了以下缺点:

  • 光总是滞后(60 FPS => 16.6ms)。对于每帧移动最多15个像素的对象,这可能看起来很糟糕。
  • 无论屏幕上有多少个灯,我都需要保持很大的纹理(可以是0,可以是100)。
  • 对于每一帧,我需要将浅色纹理清除为灰色,使用alpha进行全局调暗,然后重新绘制所有灯光..

我看到的最大优势是这只是2D,所以它并不需要知道任何阴影或其他东西。

随意发布任何建议,我很乐意阅读并测试它们。不要浪费任何不必要的表现。

1 个答案:

答案 0 :(得分:1)

在这里,我可能会过度简化您的问题。如果我这样做,抱歉。

当你谈到照明和2D精灵时,我总是想到一个过度杀伤力。一个巨大的锤子(在实施时间和渲染时间上花费你的成本)是一个非常小的钉子。

有很多方法可以非常便宜和有效的方式模拟照明。

一个典型的例子是绘制一个带有alpha的位图,模拟效果的光点,从而创造出一种非常好的假照明"假照明"在等距游戏。有(或者更好的是)有很多商业游戏使用这个技巧。

这方面的一个例子 https://gamedev.stackexchange.com/questions/22159/can-i-achieve-a-torchlight-effect-lighter-area-around-a-light-source-in-a-2d-g

如果假设您可以使用这样的解决方案,您可以在解决方案的平价上获得出色的性能,因为这种效果比任何其他照明计算便宜得多。

我希望能以某种方式提供帮助。

干杯 毛里齐奥