2016-01-01 1 views
1

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

Любые идеи, что здесь не так?

+0

Включите устройство отладки Direct3D, чтобы получить более описательную диагностику из среды выполнения Direct3D. Используйте '' DeviceCreationFlags.Debug'' и установите «Включить собственную отладку кода». См. [SharpDX] (https://github.com/sharpdx/SharpDX/wiki/Usage) –

+0

Да, я полностью забыл об этой функции, поскольку она не работала для меня на VS2012. Итак, что такое отладка, заключается в том, что промежуточный ресурс не может быть привязан к какому-либо этапу конвейера, а формат R32G32B32 не поддерживается для просмотра неупорядоченного доступа. Мне пришлось изменить формат на R32G32B32A32_Float, чтобы он работал. Спасибо огромное! –

ответ

3

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

+0

Это именно то, что я сделал :) –

Смежные вопросы