opengl-es - 使用 OpenGl 渲染真实的闪电

标签 opengl-es line real-time lightning

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

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

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

我想为每个线段生成两个平面,在 X 交叉中以创建线条粗细的效果。通过禁用深度缓冲区写入进行渲染,使用某种关闭的加法混合模式。使用带 alpha channel 的电子外观纹理对每个线段进行纹理处理。

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

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

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

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

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

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

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

最佳答案

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

关于opengl-es - 使用 OpenGl 渲染真实的闪电,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8640940/

相关文章:

ios - 旋转相机使用 lookat 功能与平移手势

windows - 基于 OpenGL ES 的桌面硬件加速 OpenVG 实现

iphone - 在单个 iPhone View 中使用 Cocos2d

C# 画线 OnPaint() 与 CreateGraphics()

javascript - 使用 webRTC 在两个对等点之间创建和使用数据通道

python - 从 C++ exe 中获取输出并在 Python 中实时处理它

android - 在 arcore 中的 3d 对象上使用模板蒙版时出现问题

C - 试图回到文件中的上一行

用于检查直线是否与形状相交的 Java 类

algorithm - 快速生成彩色矩形