2013-08-30 2 views
0

Я пытаюсь чередовать данные вершин в контейнер STL векторного шаблона std. Я успешно сделал это с OpenGL уже, исходный код моего интерфейса сетки доступен в Интернете для моего проекта с открытым исходным кодом ... https://github.com/RobertBColton/enigma-dev/blob/master/ENIGMAsystem/SHELL/Graphics_Systems/OpenGL3/GL3model.cppDirect3D 9.0 Interleaved non-fvf Vertex Buffer

Теперь я хочу сделать тот же метод с помощью DirectX и уже успел это сделать частично путем логического xor'ing моего FVF DWORD вместе с тем, какие компоненты каждой вершины у меня есть. Однако это то, что сетка в настоящее время оказывает как тогда, когда он содержит только вершины и нормаль ... http://oi42.tinypic.com/2diq2dw.jpg

Теперь DX делает это очень трудно для меня, чтобы сделать то же самое, что я делал в OGL, я проверил, проверил , и проверяется снова и снова, и мое выравнивание байтов отлично в буфере. То, что я пытаюсь сделать, может быть лучше объяснить OpenGL Wiki ... /вики/Vertex_Specification_Best_Practices # Formatting_VBO_Data

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

+0

Если вы прочитали лучшие рекомендации по спецификации вершин, в нем также говорится, что вы не должны использовать цвета с плавающей запятой. RGB float - это формат, совместимый с T & L, на старом оборудовании, но RGBA - нет. RGBA ubyte T & L-friendly, а также занимает 1/4 места для хранения. RGBA ubyte также используется в формате D3D для таких вещей, как D3DFVF_DIFFUSE, хотя он находится в заказе ARGB. –

+0

Привет за ваш ответ! Но что касается triangleCount, это не количество треугольников, то есть количество элементов по индексам, я думаю, вы были немного запутаны в этой части моего кода. Версия OpenGL уже работает отлично http://oi39.tinypic.com/2w53cqv.jpg. Но спасибо за информацию о том, что это действительно полезно, есть ли у вас какие-либо предложения, как я могу изменить его, так как я использую вектор типа gs_scalar (который означает графический системный скаляр, по умолчанию - float)? – Goombert

+0

Что я хотел бы сделать, это использовать std :: vector вместо std :: vector . Это обычный подход к перемеженным форматам. Что-то вроде struct {float pos [3]; float normal [3]; Цвет DWORD; float tex_st [2]; } // <- D3D9 ... D3D имеет макрос, который можно использовать для упаковки цветов с плавающей запятой в DWORD, 'D3DCOLOR_COLORVALUE (r, g, b, a)'. При правильном формате и типе данных для цвета вершин ('GL_BGRA',' GL_UNISNGED_BYTE') вы также должны иметь возможность использовать эту структуру данных в операционных системах OpenGL. –

ответ

2

После более близкого осмотра того, что вы пытаетесь сделать здесь, я считаю, что это то, что вы хотите:

D3DVERTEXELEMENT9 custom_vertex [] = 
{ 
    { 0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 }, 
    { 0, 12, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL, 0 }, 
    { 0, 24, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0 }, 
    { 0, 32, D3DDECLTYPE_D3DCOLOR, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR, 0 }, 
    D3DDECL_END() 
}; 

Формат этой структуры данных очень похожа на систему Vertex Pointer OpenGL, вы должны пройти в смещении, размер и количество компонентов (например, D3DDECLTYPE_FLOAT3). Вы также включаете назначение поля (например, D3DDECLUSAGE_COLOR). В отличие от OpenGL, D3D может рассчитать шаг для вас просто с помощью макроса D3DDECL_END().

IDirect3DVertexDeclaration9* vertex_declaration; 
d3dDevice->CreateVertexDeclaration (custom_vertex, &vertex_declaration); 

Теперь вам должно быть хорошо идти и создавать и заполнять буфер вершин, используя это объявление. Вы можете добавлять/удалять элементы по мере необходимости, используя другой массив D3DVERTEXELEMENT9.

Не забудьте использовать цвета DWORD (D3D) или 4 ubyte (OpenGL). Нет смысла использовать цвета с плавающей запятой в 90% случаев. Они просто теряют память и пропускную способность памяти.

+0

О, мужчина, ты лучший! Я отлично справился с этим, за исключением того, что модели с цветовыми значениями не получили правильный альфа. Мой код снова доступен онлайн для версии DirectX. Https://github.com/RobertBColton/enigma-dev/blob/master/ENIGMAsystem/SHELL /Graphics_Systems/Direct3D9/DX9model.cpp – Goombert

+0

Это то, что версия DirectX выглядит так: http://oi40.tinypic.com/or54kx.jpg – Goombert

+0

Это то, что должно и должно выглядеть в OpenGL http: //oi39.tinypic. ком/2w53cqv.jpg – Goombert

Смежные вопросы