我试图使用OpenGL绘制大网格块(例如:114x112x21单元格)。
据我所知......每个单元格应绘制为6个面(12个三角形),每个面包含4个顶点。每个顶点都有位置,法线和颜色矢量(每个都是3 * sizeof(GLfloat))。
这些值将在VBO中传递给VRam。我对上面提到的例子进行了一些计算,发现存储这些数据的成本约为200MB。我不确定这是否正确,但如果确实如此,我认为对于这样的模型来说,VRAM太多了。
我确信有更有效的方法可以做到这一点。如果有任何可以指出我正确的方向,我将非常感激。
编辑:我可能不清楚细胞的性质。它们没有统一的尺寸,可以缩放/平移以在同一个单元格上生成其他单元格或其他面。几乎每个细胞在每个面上都有不同的尺寸。 (这些是预定义的)另外请注意,颜色是每个单元格,并且基于不同值的算法比例(取决于用户想要可视化的)。因此,如果用户选择要显示的值(每个单元格一个),则根据比例计算颜色并用于为单元格着色。
正如@BDL在他的回答中建议的那样,我可能会使用几何着色器来计算每个面部法线。
答案 0 :(得分:1)
有几件事可以做:
有关更多提示,您必须提供有关单元格以及您希望实现的内容的更多详细信息。
答案 1 :(得分:1)
你可以做一些技巧。
首先,您可以使用每个多维数据集的实例化。然后,您可以获得单个单元格的每个顶点位置和法线,以及每个单元格的单个位置和颜色。
通过反转公式id = z * width * height + y * width + x,您实际上可以通过从实例id派生来消除单元格位置。
此外,对于您的颜色使用每个组件的浮点可能有点过分,您可能希望使用较小的格式,例如GL_RGBA8。
将其应用于您的示例(268128个单元格),我们得到的缓冲区大小约为1 MiB(其中每个单元格的4字节颜色最重要,其他颜色仅适用于单个单元格)。
请注意,这假设您需要为整个单元格使用单一颜色。如果你想要每个顶点的颜色,或每个面的每个顶点,你可以通过使用1D纹理并按实例和顶点id索引。
除非有一个恒定的模式,否则数据的最大部分将是彩色的。如果你仍然想要每个顶点颜色的每个面上每个组件的浮点数,那么单独使用颜色需要大约73 MiB。
答案 2 :(得分:0)
您可以使用实例化渲染。它在一次绘制调用中多次使用相同的着色器渲染相同的顶点数据。这是wiki(外部)的链接:https://en.wikipedia.org/wiki/Geometry_instancing