【发布时间】:2012-02-19 02:14:20
【问题描述】:
我正在开发一个渲染动态高分辨率体素景观的程序。
目前我将体素数据存储在 32x32x32 块中,每个块 4 位:
struct MapData {
char data[32][32][16];
}
MapData *world = new MapData[(width >> 5) * (height >> 5) * (depth >> 5)];
我想要做的是将它发送到我的顶点和片段着色器进行处理和渲染。我见过几种不同的方法可以做到这一点,但我不知道哪种方法最适合。
我从sampler1D 格式开始,但这会导致浮点输出介于 0 和 1 之间。我还暗示它会将其存储为每个体素 16 位。
至于统一缓冲区对象,我尝试过但未能实现。
我对所有这一切的最大担忧是不必每帧都将整个地图发送到 GPU。我希望能够加载最大为 ~256MB(1024x2048x256 体素)的地图,因此我需要能够将其全部发送一次,然后仅重新发送已更改的块。
对于我没有编写 OpenCL 来处理视频内存的最佳解决方案是什么。如果有更好的方法来存储我的体素,让这更容易,我愿意接受其他格式。
【问题讨论】:
-
如果这是体素数据,为什么不使用 3D 纹理 (GL_TEXTURE_3D)? glTexSubImage3D 允许您替换它的子区域。