【问题标题】:Most performant method for multiple 2D point-lights in webGL/openGL ? [Dynamic lights]webGL/openGL 中多个 2D 点光源的最佳性能方法? [动态灯]
【发布时间】:2014-04-09 15:02:10
【问题描述】:

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

让我先给你一些我今天早些时候在纸上勾勒出来的情况:

最终产品应如 4 所示。我的问题归结为: 您会选择哪种实现来提高性能,以及为什么要这样做。

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

我目前的方法是制作光在哪里和哪里不存在的纹理。这将在每一帧开始时渲染,但仅在下一帧使用。所以 Light 总是会落后 1 帧,反正看起来还不错。在对象(例如蓝色矩形)的正常渲染期间,我将在片段着色器中查找光纹理并将该值与对象之一组合。

但是,我看到以下缺点:

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

我看到的最大优势是这只是 2D 的,所以它实际上不需要注意任何阴影或其他东西。

请随时发表任何建议,我很乐意阅读并测试它们。不想不必要地浪费任何性能。

【问题讨论】:

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


【解决方案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

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

我希望在某些方面有所帮助。

干杯 毛里齐奥

【讨论】:

  • 好吧,我试图避免“第二个渲染步骤”,即所有灯光都被渲染为光纹理。您看不到使用半透明对象之类的东西的机会,这些对象将“照亮”之前使用 alpha 绘制的整个帧。在有光的地方,它将使用具有低 alpha 的 lightcolor,在没有光的地方,它将使用具有等于所需环境光级别的 alpha 的黑色。除非真的需要,否则我不想浪费内存带宽。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-25
  • 2015-09-15
相关资源
最近更新 更多