2014-01-16 7 views
1

У меня возникли проблемы с получением индексного буфера для отображения некоторого импортированного .obj правильно. Учитывается ориентация системы координат. (Объект сос погрузчик жёстко) может распечатать индексы мелких, так что правильно заполняет DWORD массив следует читать и установить:Directx: анализ файла Obj на индексный буфер

vector < vector <float> > index; 
index = GetObjData(FilePath, VERTEXINDEXLIST); 
for (int n=0; n<index.size(); n++){ 
    m=m+index[n].size(); 
} 

...

DWORD *IndexBuffer = new DWORD[m]; 

...

iBufferDescription.Usage     =D3D11_USAGE_DEFAULT; 
iBufferDescription.ByteWidth    =sizeof(DWORD)*m; 
iBufferDescription.BindFlags    =D3D11_BIND_INDEX_BUFFER; 
iBufferDescription.CPUAccessFlags   =0; 
iBufferDescription.MiscFlags    =0; 

D3D11_SUBRESOURCE_DATA iSRData; 
iSRData.pSysMem=IndexBuffer; 

Device->CreateBuffer(&iBufferDescription, &iSRData, &D3DIndexBuffer); 
DeviceContext->IASetIndexBuffer(D3DIndexBuffer, DXGI_FORMAT_R16_UINT, 0); 

Вот Майя генерироваться .obj:

# This file uses centimeters as units for non-parametric coordinates. 

mtllib tbox.mtl 
g default 
v -0.500000 -0.500000 -0.000000 
v 0.500000 -0.500000 -0.000000 
v -0.500000 0.500000 0.000000 
v 0.500000 0.500000 0.000000 
vt 0.000000 0.000000 
vt 1.000000 0.000000 
vt 0.000000 1.000000 
vt 1.000000 1.000000 
vn 0.000000 -0.000000 1.000000 
vn 0.000000 -0.000000 1.000000 
vn 0.000000 -0.000000 1.000000 
vn 0.000000 -0.000000 1.000000 
s 1 
g pPlane1 
usemtl initialShadingGroup 
f 1/1/1 2/2/2 3/3/3 
f 3/3/3 2/2/2 4/4/4 

2D-квадрат с 4 vertices.Passed через функции, содержание DWORD IndexBuffer «s следующим образом:

2 
1 
0 
3 
1 
2 

(-1 из всех индексов, чтобы соответствовать DirectX) Я также добавлю, что некоторые другие вещи были тоже установлен, например, ID3D11RasterizerState.

D3D11_RASTERIZER_DESC DrawStyleState; 
DrawStyleState.AntialiasedLineEnable=true; 
DrawStyleState.CullMode=D3D11_CULL_NONE; 
DrawStyleState.DepthBias=0; 
DrawStyleState.FillMode=D3D11_FILL_SOLID; 
DrawStyleState.DepthClipEnable=true; 
DrawStyleState.MultisampleEnable=true; 
DrawStyleState.FrontCounterClockwise=false; 
DrawStyleState.ScissorEnable=false; 

ID3D11RasterizerState *DS_State; 
Device->CreateRasterizerState(&DrawStyleState, &DS_State); 
DeviceContext->RSSetState(DS_State); 

Наконец рендер функция является довольно стандартным:

void Render(){ 
float ColorBlue[] = {0.3f,0.3f,1.0f,1.0f}; 
DeviceContext->ClearRenderTargetView(RenderTargetView,ColorBlue); 
    UINT stride=sizeof(VERTEX); 
    UINT Offset=0; 
    DeviceContext->IASetVertexBuffers(0,1,&D3DBuffer,&stride,&Offset); 
    DeviceContext->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);  
    DeviceContext->DrawIndexed(IndSz,0,0); 
Swapchain->Present(0,0); 

} 

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

4 vertices 
6 index array size //element size = IndSz 
Index 0: 2 
Index 1: 1 
Index 2: 0 
Index 3: 3 
Index 4: 1 
Index 5: 2 

выше получает разобранную в 1 треугольник.

|\ 
| \ 
| \ 
| \ 
------ 

Я пришел к выводу, что это может быть другая проблема, кроме того, что я могу себе представить. Я проверял проблемы с выпуском, упорядочивание, тип данных, размерность сумасшествия и, похоже, сейчас почти переписывается. Помогите!

+0

Я заметил, что изменение 'DWORD * IndexBuffer' на UINT [] изменило модель. Так же как и DXGI_FORMAT_R16_UINT' для 'DXGI_FORMAT_R32_UINT'. Убейте меня, если я ошибаюсь, но массив DWORD должен быть совместим с 'DXGI_FORMAT_R32_UINT'? edit: Я должен добавить, что я на 64-битной машине. –

ответ

3

DWORD не изменится с размером слова вашего процессора, как это смешно звучит. DWORDвсегда 32-разрядный независимо от центрального процессора в Windows, это фактически Microsoft. UINT, с другой стороны, очень расплывчато и, вероятно, изменится с размером слова процессора. Кстати, соответствующий тип данных для сопряжения с DXGI_FORMAT_R16_UINT - это фактически WORD (16-разрядный).

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

Вы хотите получить D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST, если эти 6 индексов должны образовывать ровно 2 треугольника.

+0

Большое вам спасибо! Я вернусь обратно в код, реализую это и вернусь к вам! –

+0

Остается второй вопрос.Это сработало для опубликованного файла модели, если я переключу исходный файл на триангулированный 3D-куб, вершины снова смешатся. Нужно ли определять глобальную матрицу или буфер глубины для рисования [двумерной, экранной версии] 3D-сетки? Насколько я понимаю, он просто покажет двумерную версию. (Я экспериментирую) –

+0

... или, может быть, я смотрю на какой-то z-перехват +; камера отсечение ...! –

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

  • Нет связанных вопросов^_^