Не могу создать постановку Texture3D

Я хочу создать промежуточную текстуру Texture3D и привязать ее к представлению неупорядоченного доступа, чтобы выполнить некоторые вычисления с использованием DirectCompute, а затем прочитать их с помощью процессора. К сожалению, я получил ошибку при создании 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.}

Есть идеи, что здесь не так?

1 ответ

Решение

Промежуточные текстуры нельзя привязать к конвейеру шейдеров, поэтому вам нужно сначала создать текстуру по умолчанию (также не все карты поддерживают 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, чтобы скопировать содержимое вашей заданной по умолчанию текстуры в вашу промежуточную текстуру.

После этого вы можете использовать deviceContext.MapSubresource (с флагом чтения) для доступа к вашим данным текстуры.

Другие вопросы по тегам