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に通知されます。しかし、私のOctreeでは、特定の頂点が私のOctree内のノード内にある場合など、テストを実行するための位置のみを保存したいと思います。したがって、SceneManagerという別のクラスを作成し、すべての値をstd :: vector内に格納し、最後にそれをOctreeクラスに渡すことを考えました。これにより、テストが実行され、チェックされた頂点がGPUに渡されます。これは固溶体でしょうか、それともこのようなものを実装するのに一般的なことでしょうか?前もって感謝します

4

1 に答える 1

1

一般に、実際のレンダリングジオメトリの頂点自体を八分木や使用する空間分割構造に配置することはありません。モデルを構成する頂点のセットがパーティションノードにまたがっており、それらの頂点のサブセットがカリングされる場合、モデルを適切に描画できないため、このレベルの粒度は役に立ちません。

通常は、エンティティとその境界をワールド内で表すオブジェクトを作成します(たとえば、軸指向の境界ボックス、つまり境界球は、単純で効率的な境界ボリュームです)。各エンティティは、レンダリングジオメトリにも関連付けられています(または他のサブシステムによって関連付けることができます)。エンティティ自体はoctree内でソートされます。

次に、octreeを使用して、表示されているエンティティを判別し、関連するすべてのレンダリングジオメトリをカードに送信します。

于 2012-05-01T16:03:48.157 に答える