基本分块是开始的好方法。如果需要,您可以在以后移至更复杂的数据结构,如八叉树。现在,从磁盘加载模型时,只需将地形分成给定尺寸的块即可。
根据您的数据,您可能想要将地形拆分为跨越整个高度的平面上的柱子,或者拆分为空间中的立方体。代码不完整(fmod,向量初始化,索引等),但是应该给您一个开始。
// Load vertices from disk
struct point { double x, y, z; };
vector<point> vertices;
// Create container for chunks
typedef pair<int, int> key;
unordered_map<key, vector<point>> chunks;
const int chunksize = 10;
// For each vertex
for (int i = 0; i < vertices.size(); ++i) {
// Fetch global coordinates
int x = vertices[i].x,
y = vertices[i].y,
z = vertices[i].z;
// Find containing chunk
key k;
k.first = x / chunksize;
k.second = z / chunksize;
// Calculate local coordinates
point p;
p.x = x % chunksize;
p.y = y;
p.z = z % chunksize;
// Add to chunk
chunks[k].push_back(p);
}
// Create separate buffers for each chunk
// ...
由于您现在已经拆分了网格,因此可以对其执行LOD和剔除技术,以跳过隐藏块的渲染。
试验块大小和查看距离以获得最佳结果。块大小是精确剔除与易于计算之间的权衡。为了进一步优化,您可以看一下这些更高级的优化。
遮挡剔除可以通过以非常低的分辨率在CPU上渲染网格来完成。这使您可以及早发现隐藏在其他网格后面的网格。它们不必发送到GPU,因此可以节省很多顶点着色器执行,否则将在拒绝三角形之前执行这些操作。
详细程度意味着您可以计算块的较低分辨率网格。根据与相机的距离,选择要绘制的网格之一。这允许您减少顶点的数量,因为远处的块不需要那么多的细节。这种方法在八叉树上效果很好,因为您可以将多个多维数据集合并为一个低分辨率网格,用于远离相机的区域。但是,无缝合并具有不同分辨率的两个块之间的边缘并非易事。