假设我在 corner-point-grid 中有 NX*NY*NZ 单元格.我还有一个 NX*NY*NZ boolean 值掩码,它告诉我必须绘制网格的哪些单元格。
我想在 Java3D(或 OpenGL,最后没关系,因为下面的概念是相同的)中使用尽可能少的内存创建一个高效的索引四元数组。
为了简单起见,我跳过声明每个面的法线,实际上我不需要它们,因为我使用的是平面着色且没有照明。
我为每个单元格设置了一种颜色(这是基于每个单元格的属性)。
因此,我列出了我需要根据单元格掩码绘制的面孔。
我发现自己多次重复同一个点(属于不同的面孔),以便能够为每张面孔赋予一种颜色。
关于如何提高效率,您有什么建议吗?
最佳答案
你有很多选择:
首先,您可以使用几何着色器动态生成顶点,尽管这仅在您拥有相当高端的系统时才有效。
另一种选择是分多次绘制对象。如果您不关心填充率,则可以沿 xyz 平面绘制一组四边形,直接读入体积数组。
按照相同的推理思路,您还可以对对象进行光线转换以在片段着色器中渲染它,这可能会更快,具体取决于 NX、NY 和 NZ 的大小。
如果必须绘制四边形,另一种可能是单独存储顶点数据,然后使用顶点着色器读取纹理来确定颜色坐标。您可以在多个渲染过程中拆分绘制整个网格。
如果您需要存储带有顶点的颜色数据,您可以尝试的最后一件事是存储每种颜色的 4 个副本以及 x-z 方向每个顶点坐标的 2 分量。要绘制整个阵列,您需要进行 6 次遍历,一次遍历立方体的每个面。这可以通过删除不可见面孔的 channel 来大幅优化。
当然,最终的选择取决于您需要绘制的数据量、您的目标硬件类型以及您希望在此项目上花费多少工作。
关于java - Java3D/OpenGL 角点网格的内存高效实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3792105/