使用OpenGl渲染逼真的电闪电

时间:2011-12-27 03:44:14

标签: opengl-es line real-time lightning

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

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

我使用的是opengl ES 2.0。我在思考在3D环境中呈现这种效果的最佳外观和最高性能的方法是什么,因为构成电动螺栓的线条需要看起来很坚固。#34;从任何角度看。

我正在考虑为每个线段生成两个平面,在X十字形中创建线条粗细的效果。通过禁用深度缓冲区写入进行渲染,使用某种类型的附加混合模式。使用具有alpha通道的电动纹理纹理化每个线段。

我有点担心使用这种方法生成必要的三角形列表所带来的性能损失,因为我的游戏可能会同时产生大量的闪电。但由于闪电的长度和厚度会有很大变化,我怀疑只需使用闪电的动画3D物体,拉伸并指向正确的位置就行了,这是我最初的想法。

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

这里有关于最佳方法的任何好主意吗?

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

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

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

似乎可以产生非常好的视觉效果,但是我对于额外的过滤传递并不太满意,因为游戏适用于手机这样的步骤非常昂贵。事实证明,由于额外的矩阵计算开销,移动设备的速度很慢,因此广告牌也非常昂贵。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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

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

在四边形上使用单个动画纹理,或创建程序闪电的着色器,将提供恒定的速度并使效果更容易实现。为此,this question可能会引起关注。