У меня проблемы с получением индексного буфера для корректного отображения импортированных .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 треугольник.
|\
| \
| \
| \
------
Я пришел к выводу, что это может быть другая проблема, кроме того, что я могу себе представить. Я проверил наличие проблем с отбраковкой, упорядочением, смешностью типов данных, сумасшествием с размером памяти, и теперь это похоже на переписывание. Помогите!
DWORD
не будет меняться с размером слова вашего процессора, как это ни смешно. DWORD
является всегда 32-битный независимо от того, какой процессор используется в Windows, это фактически Microsoft uint32_t
, UINT
с другой стороны, очень расплывчато и может меняться в зависимости от размера слова процессора. Кстати, соответствующий тип данных для сопряжения с DXGI_FORMAT_R16_UINT
на самом деле WORD
(16 бит).
Тем не менее, ваша актуальная проблема здесь заключается в использовании вами D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP
, Импортированная модель, которую вы показали, состоит из двух граней, шесть вершин в треугольной полосе дают четыре грани.
Ты хочешь D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST
если эти 6 индексов должны дать ровно 2 треугольника.
Других решений пока нет …