2013-03-17 2 views
3

Возможно ли использовать текстуру, сгенерированную C++ AMP в качестве экранного буфера?Использование C++ AMP с Direct2D

Я хотел бы сгенерировать изображение с моим кодом C++ AMP (уже сделано) и использовать это изображение, чтобы заполнить весь экран приложения для метро Windows 8. Изображение обновляется 60 раз в секунду.

Я не совсем свободно в Direct3D. В качестве отправной точки я использовал приложение шаблона Direct2d.

Сначала я попытался манипулировать буфером из подкачки в коде C++ AMP напрямую, но любая попытка записать эту текстуру вызвала ошибку.

Обработка данных с помощью AMP на графическом процессоре, а затем перемещение его в память процессора для создания растрового изображения, которое я могу использовать в D2D API, кажется неэффективным.

Может ли кто-нибудь поделиться фрагментом кода, который позволил бы мне манипулировать текстурой буфера обмена с C++ AMP напрямую (без данных, выходящих из графического процессора) или, по крайней мере, заполнить этот буфер данными из другой текстуры, которая не покидает графический процессор ?

ответ

2

Вы можете взаимодействовать между текстурой AMP <> и буфером ID3D11Texture2D. Полный код и другие примеры взаимодействия можно найти в Chapter 11 samples here.

// Get a D3D texture resource from an AMP texture. 

texture<int, 2> text(100, 100); 
CComPtr<ID3D11Texture2D> texture; 
IUnknown* unkRes = get_texture(text); 
hr = unkRes->QueryInterface(__uuidof(ID3D11Texture2D), 
    reinterpret_cast<LPVOID*>(&texture)); 
assert(SUCCEEDED(hr)); 

// Create a texture from a D3D texture resource 

const int height = 100; 
const int width = 100; 

D3D11_TEXTURE2D_DESC desc; 
ZeroMemory(&desc, sizeof(desc)); 
desc.Height = height; 
desc.Width = width; 
desc.MipLevels = 1; 
desc.ArraySize = 1; 
desc.Format = DXGI_FORMAT_R8G8B8A8_UINT; 
desc.SampleDesc.Count = 1; 
desc.SampleDesc.Quality = 0; 
desc.Usage = D3D11_USAGE_DEFAULT; 
desc.BindFlags = D3D11_BIND_UNORDERED_ACCESS | D3D11_BIND_SHADER_RESOURCE; 
desc.CPUAccessFlags = 0; 
desc.MiscFlags = 0; 

CComPtr<ID3D11Texture2D> dxTexture = nullptr; 
hr = device->CreateTexture2D(&desc, nullptr, &dxTexture); 
assert(SUCCEEDED(hr)); 

texture<uint4, 2> ampTexture = make_texture<uint4, 2>(dxView, dxTexture); 
Смежные вопросы