【发布时间】:2014-04-09 15:02:10
【问题描述】:
我正在开发一款游戏,它基本上是一个快速变化的 2D 场景,其中一些点光源(每个都可以有自己的颜色)放置在屏幕上,它们也可以继续前进每一帧都有自己的。
让我先给你一些我今天早些时候在纸上勾勒出来的情况:
最终产品应如 4 所示。我的问题归结为: 您会选择哪种实现来提高性能,以及为什么要这样做。
- 需要多少着色器程序,需要哪些资源以及有多大(纹理?VBO?)
- 多少上下文切换(程序更改,其他制服,..)
我目前的方法是制作光在哪里和哪里不存在的纹理。这将在每一帧开始时渲染,但仅在下一帧使用。所以 Light 总是会落后 1 帧,反正看起来还不错。在对象(例如蓝色矩形)的正常渲染期间,我将在片段着色器中查找光纹理并将该值与对象之一组合。
但是,我看到以下缺点:
- 光总是滞后(60 FPS => 16.6ms)。对象每帧最多移动 15 个像素,这可能看起来很糟糕。
- 无论屏幕上有多少灯(可以是 0,可以是 100),我都需要保持大纹理。
- 对于每一帧,我都需要使用 alpha 将光照纹理清除为灰色以进行全局调暗,然后重绘所有灯光..
我看到的最大优势是这只是 2D 的,所以它实际上不需要注意任何阴影或其他东西。
请随时发表任何建议,我很乐意阅读并测试它们。不想不必要地浪费任何性能。
【问题讨论】:
-
嘿,我只是在这里发布这个也许它仍然相关。我为我的库创建了一个自定义光照方法:github.com/azarus/SGL.js 示例: azarus.github.io/sgl.js/examples/light.html 它使用顶点着色器计算阴影非常快。
标签: canvas opengl-es opengl-es-2.0 webgl