Directx: парсинг файла Obj в индексный буфер

У меня проблемы с получением индексного буфера для корректного отображения импортированных .obj.
Это было принято во внимание ориентация системы координат. (Загрузчик obj был жестко запрограммирован) может нормально распечатывать индексы, поэтому он правильно заполняет DWORD массив для чтения и установки:

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 вершинами. Проход через функцию, DWORD IndexBufferпрочитанное содержание:

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 треугольник.

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

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

1

Решение

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

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

Ты хочешь D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST если эти 6 индексов должны дать ровно 2 треугольника.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]