0

我目前正在为我的学士论文项目实施八叉树。我的八叉树将 std::vector 作为参数:

octree::Octree::Octree(std::vector<const D3DXVECTOR3*> vec) : 
    m_vertices(std::vector<D3DXVECTOR3*>()),
    m_size(m_vertices.size())
{
    int i=0;
    for(;i<m_size;++i) {
        m_vertices.push_back(new D3DXVECTOR3(*vec.at(i)));
    }
}

我在渲染顶点并对它们进行任何剔除测试等之前询问通常用于存储顶点的内容。

我现在保持这个非常简单,我所拥有的只是一个渲染网格的函数。一些片段:

#define GRIDFVF (D3DFVF_XYZ | D3DFVF_DIFFUSE)

struct GridVertex {
    D3DXVECTOR3 position; 
    DWORD color;
};


g_dev->SetTransform(D3DTS_WORLD, &matIdentity);
g_dev->SetStreamSource(0, g_buffer, 0, sizeof(GridVertex));
g_dev->SetTexture(0, NULL);
g_dev->DrawPrimitive(D3DPT_LINELIST, 0, GridSize * 4 + 2);

现在,当渲染它时,我使用我的自定义结构 GridVertex,即为 pos 保存一个 D3DXVECTOR9,为颜色值保存一个 DWORD,并通过将灵活的顶点格式设置为 GRIDFVF 来告诉 GPU。但是在我的八叉树中,如果某些顶点在我的八叉树内的节点内,我只想存储位置以执行测试,依此类推。因此,我想创建另一个名为 SceneManager 的类并将所有值存储在 std::vector 中,最后将其传递给我的 Octree 类,该类进行测试,然后将检查的顶点传递给 GPU。这会是一个可靠的解决方案还是实现这样的事情的常见方法?提前致谢

4

1 回答 1

1

通常,不会将实际的渲染几何顶点本身放入八叉树或使用的任何空间分区结构中。这种粒度级别没有用处,因为如果构成模型的一组顶点跨越分区节点,以至于这些顶点的某些子集将被剔除,则您无法正确绘制模型。

您通常想要做的是拥有一个表示实体及其在世界中的边界的对象(例如,面向轴的边界框或边界球体是简单而有效的边界体)。每个实体还与渲染几何相关联(或可以由其他子系统相关联)。实体本身在八叉树中排序。

然后,您使用您的八叉树来确定哪些实体是可见的,并将其所有关联的渲染几何体提交到卡。

于 2012-05-01T16:03:48.157 回答