У меня возникли проблемы с получением индексного буфера для отображения некоторого импортированного .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 треугольник.
|\
| \
| \
| \
------
Я пришел к выводу, что это может быть другая проблема, кроме того, что я могу себе представить. Я проверял проблемы с выпуском, упорядочивание, тип данных, размерность сумасшествия и, похоже, сейчас почти переписывается. Помогите!
Я заметил, что изменение 'DWORD * IndexBuffer' на UINT [] изменило модель. Так же как и DXGI_FORMAT_R16_UINT' для 'DXGI_FORMAT_R32_UINT'. Убейте меня, если я ошибаюсь, но массив DWORD должен быть совместим с 'DXGI_FORMAT_R32_UINT'? edit: Я должен добавить, что я на 64-битной машине. –