Не могу создать постановку 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 (с флагом чтения) для доступа к вашим данным текстуры.