2

我正在为我的 3D 游戏实现一个简单的闪电效果,如下所示:

http://www.krazydad.com/bestiary/bestiary_lightning.html

我正在使用opengl ES 2.0。不过,我正在思考在 3D 环境中渲染它的最佳外观和性能效率最高的方法是什么,因为从任何角度观看时,构成电动螺栓的线条都需要看起来“实心”。

我正在考虑为每个线段生成两个平面,在 X 交叉中创建线条粗细的效果。通过禁用深度缓冲区写入进行渲染,使用某种附加混合模式。使用带有 Alpha 通道的电外观纹理对每个线段进行纹理处理。

不过,我有点担心使用这种方法生成必要的三角形列表会影响性能,因为我的游戏可能会同时生成很多闪电。但由于闪电的长度和厚度会有很大差异,我怀疑简单地使用一个闪电的动画 3D 对象,拉伸并指向正确的位置,这是我最初的想法。

我正在考虑一种替代方法,在后处理过程中使用投影端点之间的 2D 线渲染闪电。这应该很有效,因为在我的例子中透视效果可以忽略不计,除非让线条出现在遮挡对象后面会很棘手。

关于这里的最佳方法有什么好的想法吗?

编辑:我从 nVidia 找到了这份白皮书:

http://developer.download.nvidia.com/SDK/10/direct3d/Source/Lightning/doc/lightning_doc.pdf

它使用一种方法,为每个线段设置广告牌,然后应用一些过滤来平滑每个广告牌产生的间隙和重叠。

似乎产生了相当不错的视觉效果,但是我对额外的过滤通道不太满意,因为游戏适用于手机,这样的步骤非常昂贵。而且,事实证明,广告牌的 CPU 成本也很高,因为额外的矩阵计算开销在移动设备上很慢。

4

2 回答 2

2

我最终做了类似 nVidia 论文建议的事情,但为了避免需要后处理步骤,我为不同类型的分支角度使用了不同类型的纹理,以避免段角的间隙和重叠,结果非常好。为了避免昂贵的广告牌矩阵计算,我改为使用更二维的方法绘制线段,但手动计算线段中每个顶点的深度值。这会产生可接受的性能和视觉效果。

于 2011-12-27T10:48:25.883 回答
0

可能由着色器驱动的动画纹理可能是处理此问题的最快方法。

任何几何生成和渲染都会限制效果的质量,并且可能会占用更多的 CPU 时间、内存带宽和绘制调用。

在四边形上使用单个动画纹理或创建程序闪电的着色器将提供恒定的速度并使效果更易于实现。为此,这个问题可能很有趣。

于 2011-12-27T03:53:15.997 回答