2015-04-23 2 views
0

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

ID3D11Buffer * cbPerObjectBuffer; 
cbPerObject cbPerObj; 

cbPerObjectBuffer = 0; 

D3D11_BUFFER_DESC cbbd; 
ZeroMemory(& cbbd, sizeof(D3D11_BUFFER_DESC)); 

cbbd.Usage = D3D11_USAGE_DEFAULT; 
cbbd.ByteWidth = sizeof(cbPerObject); 
cbbd.BindFlags = D3D11_BIND_CONSTANT_BUFFER; 
cbbd.CPUAccessFlags = 0; 
cbbd.MiscFlags = 0; 
cbbd.StructureByteStride = 0; 

hr = device - > CreateBuffer(& cbbd, NULL, & cbPerObjectBuffer); 
if (hr == E_INVALIDARG) { 
    MessageBox(0, L "[CBPEROBJECTBUFFER] An invalid parameter was passed to the returning function.", L "Error", MB_OK); 
    return; 
} else if (hr == E_OUTOFMEMORY) { 
    MessageBox(0, L "[CBPEROBJECTBUFFER] Out of memory", L "Error", MB_OK); 
    return; 
} else if (FAILED(hr)) { 
    MessageBox(0, L "[CBPEROBJECTBUFFER] An unknown error occured", L "Error", MB_OK); 
    return; 
} 

Я продолжаю получать ошибку E_INVALIDARG при запуске кода. Я сам не могу понять, почему я получаю эту ошибку. Если бы кто-нибудь мог указать мне в правильном направлении, я был бы умен! :)

+0

Не решение проблемы, но вы можете найти решение с помощью [уровня отладки (см. MSDN)] (https://msdn.microsoft.com/en-us/library/windows/desktop /jj200584(v=vs.85).aspx). Его диагностические сообщения обычно весьма полезны. – Timbo

+0

Спасибо. Однако я не могу понять, что включить, чтобы использовать DX :: ThrowIfFailed. Есть идеи? –

+0

ThrowIfFailed для этого не требуется. Важной частью является флаг отладки, добавленный в вызов создания. Затем он должен начать писать сообщения для отладки вывода. – Timbo

ответ

2

Я предполагаю, что «cbPerObject» не является кратным 16 байт. Константные буферы должны быть кратными 16 байтам.

+0

Кажется, что умножение ByteWidth с 16 исправило проблему. –

+0

Округление до следующего кратного 16 - это то, что вам нужно сделать, а не умножить на 16. Если умножить на 16, буферы констант, которые вы создаете, будут примерно в 16 раз слишком большими и потратить много памяти. –

+0

Будет ли этот метод округления эффективным. cbbd.ByteWidth = sizeof (cbPerObject) + 16 - (sizeof (cbPerObject)% 16); ? –