OpenGL/GLSL:如何从体积数据中渲染出最佳的云/烟效果算法?

3
我希望能够渲染3D体数据:密度(可以映射到Alpha通道),温度(可以映射到RGB)。 目前我正在模拟最大强度投影,例如:在最后呈现最密集/不透明的像素。但是这种方法会失去深度感知。 我想模仿烟雾中火焰的效果。 那么我的问题是,在OpenGL中生成基于可用数据的图像的技术是什么? 欢迎任何想法。 谢谢Arman。
1个回答

4
我会先尝试使用体积光线投射器。
您可以搜索“使用光线投射进行体积可视化”,那应该能给您大部分所需信息。NVIDIA有一个很好的示例(使用opengl)通过3D纹理进行光线投射。
在您特定的实现中,您只需要不断地遍历体积并累加温度,直到达到所需密度。
如果您的体积不适合视频内存,则可以分段进行光线投射,然后进行组合步骤。
快速描述光线投射:
CPU: 1)以世界空间中的六面立方体作为绘图基元,确保使用深度剔除。
顶点着色器: 2)在顶点着色器中存储顶点的世界位置(这将插值每个片段)
片段着色器: 3)使用插值位置减去相机位置来获取通过体积的遍历向量。 4)使用while循环从立方体上的点穿过另一侧遍历体积。有三种方法可以知道何时结束。 A)在每个步骤中测试点是否仍在立方体中。 B)与立方体进行光线交叉,并计算交叉点之间的距离。 C)对具有正向面剔除的立方体进行预渲染,并将深度存储到第二个纹理映射中,然后只需在屏幕像素处进行采样即可获取距离。
5)在循环时累加并设置像素颜色。

@Jose:Jose,谢谢你的回复。是的,你说得对,也许光线投射是做法。我尝试过多次按照Nvidia的示例进行光线投射,但我从未在光线投射方法中实现高动态分辨率。问题更深入,为了制作3D纹理,我正在将粒子数据插值到网格上,但这使得分辨率变低。您可以通过pmviewer查看使用粒子渲染的图像http://www.aip.de/People/AKhalatyan/images/HALO198_2048.jpg。您的算法是否适用于纹理粒子? - Arman
你的原始数据实际上是点云吗?然后你从中创建了一个3D纹理,但纹理的分辨率导致你失去了精度。如果我说错了,请纠正我。 - Jose
1
我能想到两种方法,但我不知道它们是否具有您所需的性能。无论哪种方式,您都需要对数据进行分区(可能是八叉树),并在渲染时进行修剪。1)将每个粒子固定在板上(基于深度的精灵)。2)使用修改后的光线跟踪器。每个点变成一个球体,并在屏幕的每个像素上发射一条射线。与其反射球体,您会穿过它,直到密度达到阈值,然后返回温度累积。 - Jose

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接