2016-11-07 58 views
0

我工作的支持DirectX C++/CX(通用的Windows)項目。如何將變量添加到constantbuffer

我不是所有的方式,熟悉的DirectX11。

我的代碼主要是基於與在UWP使用swapchainpanels渲染的DirectX MSDN上的樣本項目。

現在我想一個float變量添加着色器。我相信這必須使用常量緩衝區來完成。目前這如下(和作品):

//c++: 
struct ModelViewProjectionConstantBuffer 
{ 
    DirectX::XMFLOAT4X4 model; 
    DirectX::XMFLOAT4X4 view; 
    DirectX::XMFLOAT4X4 projection; 
    //float distance; 
}; 

//hlsl: 
cbuffer ModelViewProjectionConstantBuffer : register(b0) 
{ 
    matrix model; 
    matrix view; 
    matrix projection; 
    //float distance; 
}; 

現在,當我添加一個浮動,它停止工作。它拋出當我更新的常量緩衝區(每個渲染幀之前恰好)一個例外:

_d3dContext->UpdateSubresource(
    _constantBuffer.Get(), 
    0, 
    NULL, 
    &_constantBufferData, 
    0, 
    0 
); 

唯一的例外是SEHException(所以只要我能找到,這並沒有告訴我任何東西)。

我立足這一切以下頁面: https://msdn.microsoft.com/en-us/library/ff476896(v=vs.85).aspx

誰能告訴我什麼,我做錯了什麼?其實在16個字節

回答

2

恆緩衝區大小都一致,當你不得不在最後一個單精度浮點數,你用16擡高不斷緩衝區的大小,但在代碼方面,你的結構只有4.什麼是發生膨脹UpdateSubResource嘗試讀取這12個額外的字節併產生內存訪問衝突。

你應該能夠加入這樣的

struct ModelViewProjectionConstantBuffer 
{ 
    DirectX::XMFLOAT4X4 model; 
    DirectX::XMFLOAT4X4 view; 
    DirectX::XMFLOAT4X4 projection; 
    float distance; 
    float pad[3] 
}; 

填充你可以在這裏閱讀有關填充規則有關詳細信息,解決的事情:https://msdn.microsoft.com/en-us/library/windows/desktop/bb509632(v=vs.85).aspx

+0

如果你的推理是正確的,這是核心問題,那麼使用'XMFLOAT4X4A'代替'XMFLOAT4X4'將會更容易和更安全。因此填充不再是必需的。 – IInspectable

+0

@IInspectable不是真的,有些規則是更微妙的,不能用C++語言重現,即使在OP的情況下,它會做的伎倆。另一種解決方案是將代碼對象的大小提供給'UpdateSubResource',但是然後調試層將洪泛日誌,併發出一個警告,即您上傳的內容小於cbuffer大小(在我們的例子中爲100%安全)。 – galop1n

+0

謝謝,是的,修復它。我意識到現在他們正在試圖在這些msdn頁面上發表意見(但我覺得他們可能已經更清楚了)。 如果異常包含任何有用的信息,它也將是有用的。 :| – Stef