2015-04-23 35 views
0

我試圖弄清楚爲什麼在運行我的代碼時我總是收到E_INVALIDARG錯誤。D3D11中的E_INVALIDARG

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/zh-cn/library/windows/desktop /jj200584(v=vs.85).aspx)。它的診斷信息通常非常有用。 – Timbo

+0

謝謝。不過,我似乎無法弄清楚使用DX :: ThrowIfFiled的內容。有任何想法嗎? –

+0

ThrowIfFiled無法正常工作。重要的部分是添加到創建調用的調試標誌。然後它應該開始寫消息來調試輸出。 – Timbo

回答

2

我的猜測是'cbPerObject'不是16字節的倍數。常量緩衝區必須是16個字節的倍數。

+0

這似乎是乘以16的ByteWidth解決了這個問題。 –

+0

四捨五入到16的下一個倍數是你所需要做的,而不是乘以16.如果你乘以16,你創建的常量緩衝區大概是16倍,並且浪費了大量的內存。 –

+0

這種四捨五入方法是否有效。 cbbd.ByteWidth = sizeof(cbPerObject)+ 16 - (sizeof(cbPerObject)%16); ? –