我工作的支持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個字節
如果你的推理是正確的,這是核心問題,那麼使用'XMFLOAT4X4A'代替'XMFLOAT4X4'將會更容易和更安全。因此填充不再是必需的。 – IInspectable
@IInspectable不是真的,有些規則是更微妙的,不能用C++語言重現,即使在OP的情況下,它會做的伎倆。另一種解決方案是將代碼對象的大小提供給'UpdateSubResource',但是然後調試層將洪泛日誌,併發出一個警告,即您上傳的內容小於cbuffer大小(在我們的例子中爲100%安全)。 – galop1n
謝謝,是的,修復它。我意識到現在他們正在試圖在這些msdn頁面上發表意見(但我覺得他們可能已經更清楚了)。 如果異常包含任何有用的信息,它也將是有用的。 :| – Stef