SlimDX常量缓冲区创建导致无效的参数异常

时间:2011-02-21 19:44:45

标签: c# exception directx buffer slimdx

我有以下代码来实例化一个常量缓冲区并将其绑定到像素着色器。 ConstantBuffers.EveryFrame是ConstantBuffers类中的一个结构,它保存了每帧需要更新的所有数据(当前只是一个Color3对象)。

everyFrame是一个Direct3D11 Buffer对象,我用它作为我的常量缓冲区。 Context是我的D3DDevice.ImmediateContext

int sizeInBytes;
ConstantBuffers.EveryFrame cb1 = new ConstantBuffers.EveryFrame();
cb1.Color = new Color3(0, 0, 0);
sizeInBytes = Marshal.SizeOf(typeof(ConstantBuffers.EveryFrame));
using (DataStream data = new DataStream(sizeInBytes, true, true))
{
    data.Write(cb1);
    data.Position = 0;
    everyFrame = new D3D.Buffer(device, data, new BufferDescription
    {
        Usage = ResourceUsage.Default,
        SizeInBytes = sizeInBytes,
        BindFlags = BindFlags.ConstantBuffer
    });
    context.PixelShader.SetConstantBuffer(everyFrame, 0);
}

当我运行此代码时,我收到以下错误:

SlimDX.Direct3D11.Direct3D11Exception was unhandled
  Message=E_INVALIDARG: An invalid parameter was passed to the returning function (-2147024809)
  Source=SlimDX
  StackTrace:
   at SlimDX.Result.Throw[T](Object dataKey, Object dataValue)
   at SlimDX.Result.Record[T](Int32 hr, Boolean failed, Object dataKey, Object dataValue)
   at SlimDX.Direct3D11.Buffer.Build(Device device, DataStream data, Int32 sizeInBytes, ResourceUsage usage, BindFlags bindFlags, CpuAccessFlags accessFlags, ResourceOptionFlags optionFlags, Int32 structureByteStride)
   at SlimDX.Direct3D11.Buffer..ctor(Device device, DataStream data, BufferDescription description)
   at VoxelGame.Form1.SetupConstantBuffers() in d:\files\my documents\visual studio 2010\Projects\VoxelGame\VoxelGame\Form1.cs:line 119
   at VoxelGame.Form1..ctor() in d:\files\my documents\visual studio 2010\Projects\VoxelGame\VoxelGame\Form1.cs:line 91
   at VoxelGame.Program.Main() in d:\files\my documents\visual studio 2010\Projects\VoxelGame\VoxelGame\Program.cs:line 21
   at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
   at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
   at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
   at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.ThreadHelper.ThreadStart()
  InnerException: 

然而,当以下代码运行时(在上面的代码之前只有几个调用),它可以正常工作。此代码不接触上面代码使用的任何变量,并且主要在单独的类中操作(设备通过类'构造函数传入,constantBuffer是存储在类'变量中的Direct3D11缓冲区)

ConstantBuffers.EveryMotion cb2 = new ConstantBuffers.EveryMotion();
int sizeInBytes = Marshal.SizeOf(typeof(ConstantBuffers.EveryMotion));
using (DataStream data = new DataStream(sizeInBytes, true, true))
{
    data.Write(cb2);
    data.Position = 0;
    constantBuffer = new D3D.Buffer(device, data, new BufferDescription
    {
        Usage = ResourceUsage.Default,
        SizeInBytes = sizeInBytes,
        BindFlags = BindFlags.ConstantBuffer
    });
    device.ImmediateContext.VertexShader.SetConstantBuffer(constantBuffer, 0);
}

这里是参考ConstantBuffer结构

[StructLayout(LayoutKind.Sequential)]
public struct EveryMotion
{
    public Matrix WorldViewProjection;
}

[StructLayout(LayoutKind.Sequential)]
public struct EveryFrame
{
    public Color3 Color;
}

1 个答案:

答案 0 :(得分:6)

常量缓冲区需要正确对齐数据; SizeInBytes属性需要是16的倍数,这是Matrix(4 * 4 * 4)的情况,但不是Color3(4 * 3)的情况。