Direct3D 11 с использованием векторов вместо массивов

#c #direct3d11

#c #direct3d11

Вопрос:

Итак, в основном я пытаюсь изучить Direct3D 11. Я запустил свою программу и успешно импортировал OBJ-файлы. Но теперь я решил использовать векторы вместо массивов, поскольку я могу захотеть изменить модели, которые я загружаю, и хотел бы, чтобы он автоматически выделял требуемую память. В любом случае, теперь, похоже, отображается только половина модели, я полагаю, что это связано с byteWidth и / или шагом, но теперь я перепробовал так много разных комбинаций и разных настроек, что я чувствую, что хожу по кругу, и я уверен, что это находится в пределах этого блокакода здесь:

 ID3D11Buffer *pVertexBuffer;
D3D11_BUFFER_DESC bd;
bd.BindFlags = D3D11_BIND_VERTEX_BUFFER;   
bd.ByteWidth = vertices.size() * sizeof(Vertex);  
bd.CPUAccessFlags = 0u;
bd.MiscFlags = 0u;
bd.Usage = D3D11_USAGE_DEFAULT;                
bd.StructureByteStride = sizeof(Vertex);
D3D11_SUBRESOURCE_DATA sd = {};
sd.pSysMem = vertices.data();
dev->CreateBuffer(amp;bd, amp;sd, amp;pVertexBuffer);
const UINT stride = sizeof(Vertex);
const UINT offset = 0u;
devcon->IASetVertexBuffers(0u, 1u, amp;pVertexBuffer, amp;stride, amp;offset);

ID3D11Buffer *pIndexBuffer;
D3D11_BUFFER_DESC ibd;
ibd.BindFlags = D3D11_BIND_INDEX_BUFFER;   
ibd.ByteWidth = indices.size() * sizeof(Index);  
ibd.CPUAccessFlags = 0u;
ibd.MiscFlags = 0u;
ibd.Usage = D3D11_USAGE_DEFAULT;                
ibd.StructureByteStride = sizeof(Index);
D3D11_SUBRESOURCE_DATA isd = {};
isd.pSysMem = indices.data();
dev->CreateBuffer(amp;ibd, amp;isd, amp;pIndexBuffer);
devcon->IASetIndexBuffer(pIndexBuffer, DXGI_FORMAT_R16_UINT, 0u);
  

для справки я вставил полный код: здесь

Комментарии:

1. Вам необходимо проверить все результаты на предмет сбоя или успеха.

Ответ №1:

Вот мое предположение.

 devcon->IASetIndexBuffer(pIndexBuffer, DXGI_FORMAT_R16_UINT, 0u);
  

Прямо здесь вы сообщаете directx, что ваши индексы равны uint16_t, однако вы объявляете свои индексы как ‘unsigned int’.

Это плохо.

unsigned int обычно составляет 32 бита (4 байта). А uint16 — это 16 бит (2 байта).

Поэтому существует несоответствие.

 struct Index{
    unsigned int a, b, c;
};
  

Вы не должны использовать unsigned int . Вы должны использовать uint16_t.

Если это не проблема, то вам все равно следует внести это изменение, потому что, на мой взгляд, вы просто напрашиваетесь на неприятности.

При работе с графическими API будьте очень осторожны с выбранными типами, чтобы избежать подобных проблем во время выполнения.

Вот ссылка на ссылку на типы с фиксированной шириной: https://en.cppreference.com/w/cpp/types/integer