在3D中可视化10,000个阴影框的最简单方法

时间:2011-06-30 19:16:44

标签: visualization 3d data-visualization

我有一个简单的任务:我有10,000个3D盒子,每个盒子都有x,y,z,宽度,高度,深度,旋转和颜色。我想将它们放入3D空间,将其可视化,并让用户使用鼠标飞过它。有没有一种简单的方法可以把它放在一起?

1 个答案:

答案 0 :(得分:3)

使用最近的(v 3.2)OpenGL执行此操作的一种简单方法是:

  • 制作一个包含8个顶点(立方体的角)的数组,在单位立方体上给出它们的坐标,即从(-1,-1,-1)到(1,1,1)
  • 创建vertex buffer object
  • 使用glBufferData将数组放入顶点缓冲区
  • 绑定顶点缓冲区
  • 创建,设置和绑定您可能想要使用的任何纹理(如果不使用纹理,请跳过此步骤)
  • 创建一个顶点着色器,根据gl_InstanceID的值
  • 应用从“某个源”(见下文)读取的变换矩阵
  • 编译着色器,链接程序,绑定程序
  • 为所有多维数据集实例设置实例转换数据(见下文)
  • 取决于您用于传递转换数据的方法,您可以一次性绘制所有内容,或使用多个批次
  • 调用glDrawElementsInstanced N 次,count设置为适合一个批次的元素
  • 如果您使用多个批次,请在
  • 之间更新转换数据
  • 除了正常的MVP内容之外,顶点着色器还应用了变换

要传达每立方体转换数据,您有几种选择,其中包括:

  • uniform buffer objects,您有保证最小 4096个值,分别为256个4x4矩阵,但您可以查询实际值
  • texture buffer objects,你有保证最小 65536个值,分别是4096个4x4矩阵(但通常更大,我的老人卡可以做128,000,000个值,你应该查询实际值值)
  • 为每个批次手动设置制服,这不需要任何“缓冲”的东西,但很可能有点慢

另外:使用pseudo-instancing即使在不支持直接实例化的硬件上也能正常工作。它不是那么优雅而且速度稍微慢一点,但它确实起到了作用。