C# Can';t创建分段纹理3d

C# Can';t创建分段纹理3d,c#,directx-11,sharpdx,C#,Directx 11,Sharpdx,我想创建staging Texture3D并将其绑定到无序访问视图,以使用DirectCompute执行一些计算,然后使用CPU读取它们。不幸的是,我在使用以下描述创建Texture3D时出错: Texture3DDescription desc = new Texture3DDescription() { BindFlags = BindFlags.UnorderedAccess, CpuAccessFlags = CpuAccessFlags.Read | CpuAccess

我想创建staging Texture3D并将其绑定到无序访问视图,以使用DirectCompute执行一些计算,然后使用CPU读取它们。不幸的是,我在使用以下描述创建Texture3D时出错:

Texture3DDescription desc = new Texture3DDescription()
{
    BindFlags = BindFlags.UnorderedAccess,
    CpuAccessFlags = CpuAccessFlags.Read | CpuAccessFlags.Write,
    Depth = sunAngleIterations,
    Format = SharpDX.DXGI.Format.R32G32B32_Float,
    Height = viewAngleIterations,
    MipLevels = 1,
    OptionFlags = ResourceOptionFlags.None,
    Usage = ResourceUsage.Staging,
    Width = heightIterations
};

texture = new Texture3D(device, desc);
引发的异常是:

{HRESULT: [0x80070057], Module: [General], ApiCode: [E_INVALIDARG/Invalid Arguments], Message: Parameter jest niepoprawny.}

有什么问题吗?

分段纹理无法绑定到着色器管道,因此您需要首先创建默认纹理(并非所有卡都支持3个通道,因此我也更改了格式,尝试采样3个通道纹理可能无法工作或使驱动程序崩溃)

然后执行计算并使用分段纹理检索数据:

Texture3DDescription stagingdesc = new Texture3DDescription()
{
    BindFlags = BindFlags.None,
    CpuAccessFlags = CpuAccessFlags.Read,
    Depth = sunAngleIterations,
    Format = SharpDX.DXGI.Format.R32G32B32A32_Float,
    Height = viewAngleIterations,
    MipLevels = 1,
    OptionFlags = ResourceOptionFlags.None,
    Usage = ResourceUsage.Staging,
    Width = heightIterations
};

stagingtexture = new Texture3D(device, stagingdesc);
然后需要使用deviceContext.CopyResource将默认rexture的内容复制到暂存纹理


完成后,您可以使用deviceContext.MapSubresource(带读取标志)访问纹理数据。

启用Direct3D调试设备,以便从Direct3D运行时获得更多描述性诊断。使用
DeviceCreationFlags.Debug
并设置“启用本机代码调试”。是的,我完全忘记了这个函数,因为它在VS2012上对我不起作用。所以,调试所说的是,暂存资源不能绑定到任何管道阶段,并且无序访问视图不支持R32G32B32格式。我不得不将格式更改为R32G32B32A32_Float以使其工作。非常感谢你!这正是我所做的:)
Texture3DDescription stagingdesc = new Texture3DDescription()
{
    BindFlags = BindFlags.None,
    CpuAccessFlags = CpuAccessFlags.Read,
    Depth = sunAngleIterations,
    Format = SharpDX.DXGI.Format.R32G32B32A32_Float,
    Height = viewAngleIterations,
    MipLevels = 1,
    OptionFlags = ResourceOptionFlags.None,
    Usage = ResourceUsage.Staging,
    Width = heightIterations
};

stagingtexture = new Texture3D(device, stagingdesc);