У меня есть следующий код для создания константы буфера и привязки его к пиксельному шейдеру. ConstantBuffers.EveryFrame - это структура в классе ConstantBuffers, которая содержит все данные, которые мне нужно обновить для каждого кадра (в настоящее время это только один объект Color3).
everyFrame - это объект буфера Direct3D11, который я использую в качестве постоянного буфера. Контекст - это мой 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;
}