【问题标题】:SharpDX - Creating constant buffer crashesSharpDX - 创建常量缓冲区崩溃
【发布时间】:2016-02-01 23:08:31
【问题描述】:

我正在使用 SharpDX 在 C# 中创建一个基本的 DirectX 程序。我正在尝试使用常量缓冲区将一些数据向下传递到着色器,但是当我创建缓冲区时,DirectX 会因参数不正确而崩溃。启用调试层不再给我信息。我的代码如下所示:

consts = new ConstantBufferData() { fTime = 0.0f };
constantBuffer = D3D11.Buffer.Create<ConstantBufferData>(device, D3D11.BindFlags.ConstantBuffer, ref consts);

其中 ConstantBufferData 是这样定义的结构:

[StructLayout(LayoutKind.Sequential)]
struct ConstantBufferData
{
    public float fTime;
};

奇怪的是,当我将缓冲区创建为顶点缓冲区时,整个程序编译并正常运行,但将其用作context.PixelShader.SetConstantBuffer(0, constantBuffer); 的常量缓冲区。

【问题讨论】:

  • 你正在堆栈上创建缓冲区,我不知道 SharpDX,但我猜这不是故意的。

标签: c# .net parameters directx sharpdx


【解决方案1】:

常量缓冲区大小必须是 16 的倍数,这不是你的结构(只有 4)的情况,所以创建会失败。

另一方面,顶点缓冲区没有这个限制,所以在这种情况下资源会成功创建。

如果您打开调试设备,您应该会收到以下错误消息:

D3D11 错误:ID3D11Device::CreateBuffer:尺寸无效。对于标有 D3D11_BIND_CONSTANT_BUFFER BindFlag 的 ConstantBuffers,ByteWidth(值 = 4)必须是 16 的倍数。 [ STATE_CREATION ERROR #66: CREATEBUFFER_INVALIDDIMENSIONS]

解决此问题的两种方法。

1/向结构添加填充以适应 16 的倍数,例如:

[StructLayout(LayoutKind.Sequential)]
struct ConstantBufferData
{
    public float fTime;
    public int dum1,dum2,dum3;
};

或者在缓冲区创建时强制执行大小规则(确保描述中的大小是 16 的倍数,如果你的结构大小是“大小”,那么你有以下内容:

int paddedSize = ((size + 15) / 16) * 16;

【讨论】:

    【解决方案2】:

    我从未使用过 SharpDX,但这似乎是一个严重受限的类型参数。 检查SharpDX's github 的代码我看到它使用互操作指针来传递指针。

    所以我猜这可能是一个可见性问题,因为ConstantBufferData 没有被定义为公开。

    或者是正式的参数问题,因为据我在CreateBuffer's doc 中看到的数据参数必须符合D3D11_SUBRESOURCE_DATA 结构

    希望这会有所帮助。

    【讨论】:

    • 感谢您的帮助,但它并没有改变任何东西。我确实将 ConstantBufferData 更改为公开的,但这并没有帮助。在线查看,没有一个常量缓冲区示例具有遵循D3D11_SUBRESOURCE_DATA 的结构。这方面的一个例子在这里:timjones.tw/blog/archive/2011/03/08/…
    • 从您发布的链接中阅读,如果结构格式不明确,我发现它存在问题。您是否尝试像示例中那样将布局指定为显式、大小和偏移?
    • 哈!那解决了它!我曾尝试将结构设置为显式并设置字段偏移量,但由于某种原因,我觉得设置大小无关紧要。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2012-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多