Хранить вершины DirectX C++

В настоящее время я реализую 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, которая сохраняет D3DXVECTOR9 для pos и DWORD для значения цвета и сообщает GPU, устанавливая гибкий формат вершины в GRIDFVF. Но в моем октодереве я хочу хранить только позиции для выполнения теста, если определенные вершины находятся внутри узлов в моем октодереве и так далее. Поэтому я подумал о создании другого класса с именем SceneManager и хранении всех значений в std::vector и, наконец, передаче его моему классу Octree, который выполняет тест, а затем передает проверенные вершины в графический процессор. Будет ли это надежным решением или что общего для реализации чего-то подобного? заранее спасибо


person Chris    schedule 01.05.2012    source источник


Ответы (1)


Как правило, сами вершины фактической геометрии рендеринга не помещаются в октодерево или любую другую структуру пространственного разделения, которую вы используете. Такой уровень детализации бесполезен, потому что если набор вершин, составляющих модель, охватывает узлы разбиения так, что какое-то подмножество этих вершин будет отброшено, вы не сможете правильно нарисовать модель.

Обычно вы хотите иметь объект, представляющий объект и его границы в мире (например, ограничивающие рамки, ориентированные на оси, или ограничивающие сферы, являются простыми и эффективными ограничивающими объемами). Каждый объект также связан (или может быть связан какой-либо другой подсистемой) с геометрией рендеринга. Сами сущности сортируются внутри октодерева.

Затем вы используете свое октодерево, чтобы определить, какие объекты видны, и отправляете все связанную с ними геометрию рендеринга на карту.

person Community    schedule 01.05.2012
comment
Спасибо, Джош, но у меня остался один вопрос: а как насчет больших сущностей? Например, сетка, определяющая основу мира. Как я могу разделить это на меньшее количество объектов? Потому что сетка будет охватывать все октодерево. - person Chris; 05.05.2012
comment
Именно по этой причине (и другим) не стоит хранить мир в виде одной гигантской сетки; разбейте его на более мелкие куски, которые вы можете отбраковывать по мере необходимости. - person ; 05.05.2012