【问题标题】:How to add a variable to a constantbuffer如何将变量添加到常量缓冲区
【发布时间】:2016-11-08 02:07:57
【问题描述】:

我正在开发 Directx C++/CX(通用 Windows)项目。

顺便说一下,我对 Directx11 不是很熟悉。

我的代码主要基于 MSDN 上与使用交换链面板在 UWP 中渲染 directx 相关的示例项目。

现在我想在着色器中添加一个浮点变量。我相信这必须使用常量缓冲区来完成。目前这如下(并且有效):

//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

谁能告诉我我做错了什么?

【问题讨论】:

    标签: shader directx-11 hlsl c++-cx


    【解决方案1】:

    常量缓冲区的大小在 16 个字节上对齐,当你最后有一个浮点数时,实际上你将常量缓冲区大小膨胀了 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

    【讨论】:

    • 如果你的推理是正确的,这是核心问题,那么使用XMFLOAT4X4A 代替XMFLOAT4X4s 会更容易、更安全。因此不再需要填充。
    • @IInspectable 并非如此,有些规则更微妙,无法用 C++ 语言重现,即使在 OP 情况下,它也能解决问题。另一种解决方案是向UpdateSubResource 提供适当大小的代码对象,但随后调试层会发出警告,警告您上传的文件小于 cbuffer 大小(在我们的例子中是 100% 安全的)。跨度>
    • 谢谢,是的,它解决了。我现在意识到这就是他们试图在那些 msdn 页面上说的(但我觉得他们本来可以更清楚)。如果异常包含任何有用的信息,它也会很有用。 :|
    • @Stef:每个 SEH 异常都带有一个异常代码。你决定忽略它,现在抱怨没有有用的信息。那没有意义。将异常代码添加到您的问题中。
    • @IInspectable:我没有忽略它,我查看了该代码的含义,但一无所获。不要以为我忽略了它。如果您能指出我可以使用这些异常代码去哪里,将不胜感激。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-04
    • 2015-07-31
    • 2018-04-26
    • 1970-01-01
    • 1970-01-01
    • 2015-08-16
    • 1970-01-01
    相关资源
    最近更新 更多