可以';t创建临时Texture3D

本文关键字:Texture3D 创建 可以 | 更新日期: 2023-09-27 18:28:36

我想创建暂存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.}

你知道这里出了什么问题吗?

可以';t创建临时Texture3D

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

Texture3DDescription desc = new Texture3DDescription()
{
    BindFlags = BindFlags.UnorderedAccess,
    CpuAccessFlags = CpuAccessFlags.None,
    Depth = sunAngleIterations,
    Format = SharpDX.DXGI.Format.R32G32B32A32_Float,
    Height = viewAngleIterations,
    MipLevels = 1,
    OptionFlags = ResourceOptionFlags.None,
    Usage = ResourceUsage.Default,
    Width = heightIterations
};
texture = new Texture3D(device, desc);

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

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(带有读取标志)来访问纹理数据。