2010-09-25 22 views
2

假设我在corner-point-grid中有NX * NY * NZ单元。我还有一个NX * NY * NZ布尔的面具,它给了我必须绘制的网格的哪些单元格。内存在Java3D/OpenGL中高效地实现角点网格

我想创建在Java3D的一种有效的索引四阵列使用较少的存储器作为可能的(或OpenGL,它不会在端部关系,因为下面的概念是相同的)。

为了简单起见,我跳过申报每个面的法线和真的因为我使用的是平坦的阴影和没有照明,我不需要他们。

我对每个单元格都有一个颜色(这是基于每个单元格的属性)。

因此,我列出了我需要根据单元格蒙版绘制的面。

我发现自己重复同样的点(属于不同的面孔)几次,能够给每一个面对的颜色。

你有任何关于如何提高效率的提示吗?

+0

你对布尔掩码有任何约束,可以被利用?例如。从不在“关闭”单元之上的“开”单元?相机位置或角度的任何限制(例如始终高于“表面”)? – LarsH 2010-09-25 03:13:37

+0

嗨LarsH。不,对不起,对布尔掩码没有限制。我也尝试在3D中使用洪水填充算法,但是让我明白活动单元格是否被限制在封闭表面或不是如此之快......因此,我最终绘制了所有停留在“在“细胞和”关闭“细胞的任何方向。关于相机的位置,也没有限制:观察者应该能够从任何角度观看网格。谢谢您的帮助! – matteodg 2010-09-25 07:06:05

回答

0

你有很多选择:

首先,你可以使用几何着色器可以动态生成顶点,但如果你有一个相当高端系统,这只会工作。

另一种选择是以多次通过绘制对象。如果你不关心填充率,你可以沿xyz平面绘制一组四元组,直接读入到卷阵列中。

沿着同样的理由之后,你也可以光线投射以使其在片段着色器,这可能会更快取决于NX,NY和NZ大小的物体。

如果必须绘制四边形,另一种可能性是分别存储顶点数据,然后使用顶点着色器从纹理读取来确定颜色坐标。你可以将整个网格划分为多个渲染过程。

如果您需要的颜色数据存储与顶点,你可以尝试的最后一件事是连同2组件存储每种颜色的4份在X-Z方向上的每个顶点的坐标。要绘制整个阵列,您需要进行6次通过,其中一次针对立方体的每个面。这可以通过修剪不可见面孔的通道来大幅优化。

当然,最终的选择取决于您需要绘制的数据量,您定位的硬件类型以及您希望在此项目上花费多少工作量。