SharpDX - 创建常量缓冲区崩溃

时间:2016-01-25 21:11:15

标签: c# .net parameters directx sharpdx

我正在使用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);的常量缓冲区。

2 个答案:

答案 0 :(得分:1)

常量缓冲区大小必须是16的倍数,而结构(仅为4)的情况不是这样,因此创建将失败。

另一方面,Vertex缓冲区没有此限制,因此在这种情况下资源会成功创建。

如果启用了调试设备,则应该出现以下错误消息:

  

D3D11错误:ID3D11Device :: CreateBuffer:维度无效。对于使用D3D11_BIND_CONSTANT_BUFFER BindFlag标记的ConstantBuffers,ByteWidth(值= 4)必须是16的倍数。[STATE_CREATION错误#66:CREATEBUFFER_INVALIDDIMENSIONS]

解决此问题的两种方法。

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

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

或者对缓冲区创建强制执行大小规则(确保说明中的大小是16的倍数,以防结构大小为&#34;大小&#34;那么您有以下内容:

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

答案 1 :(得分:0)

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

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

或正式的param问题,因为据我所见CreateBuffer's doc,数据参数必须符合D3D11_SUBRESOURCE_DATA结构

希望这有帮助。