存储顶点DirectX C ++

时间:2012-05-01 13:59:33

标签: c++ data-structures directx vertices octree

我目前正在为我的学士论文项目实施Octree。 我的八叉树以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。 这是一个可靠的解决方案还是通常会实现这样的事情? 提前致谢

1 个答案:

答案 0 :(得分:1)

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

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

然后,使用八叉树来确定哪些实体可见,并将所有的相关渲染几何体提交给卡片。