Получить текстуру FLOAT из C ++ AMP вместо TYPELESS - PullRequest
0 голосов
/ 09 ноября 2019

Я хочу отобразить изображение, созданное с помощью C ++ AMP, в приложении UWP наиболее эффективным из возможных способов.

Мой подход заключается в перемещении данных AMP C ++ в ID3D11Texture2D, который может отображаться в UWP. Для этого я копирую данные в текстуру, созданную с помощью:

unsigned int bitsPerScalarElement = 32;
auto ampTexture = Concurrency::graphics::texture<Concurrency::graphics::float_4, 2>(m_width, m_height, bitsPerScalarElement);

Однако это приводит к текстуре с форматом текстуры DXGI_FORMAT_R32G32B32A32_TYPELESS. Мне бы хотелось, чтобы это был DXGI_FORMAT_R32G32B32A32_FLOAT, иначе UWP не сможет его отобразить. Он жалуется, что «растровый пиксельный формат не поддерживается».

Согласно https://blogs.msdn.microsoft.com/nativeconcurrency/2012/07/02/interop-with-direct3d11-textures-in-c-amp/ Мне нужно было только установить bitsPerScalarElement при создании текстуры, чтобы выбрать тип, но он не работает для меня.

Кто-нибудь, кто может помочь мне здесь?

Ниже приведена тестовая программа для проверки возвращенного формата:

#include "pch.h"
#include <iostream>

#include <amp.h>
#include <amp_graphics.h>

#include <d3d11.h>
#include <wrl.h>

int main()
{
    unsigned int bitsPerScalarElement = 32;
    auto ampTexture = Concurrency::graphics::texture<Concurrency::graphics::float_4, 2>(500, 500, bitsPerScalarElement);

    Microsoft::WRL::ComPtr<ID3D11Texture2D> d3dTexture;
    auto hr = Concurrency::graphics::direct3d::get_texture(ampTexture)->QueryInterface(__uuidof(ID3D11Texture2D), (void**)&d3dTexture);
    D3D11_TEXTURE2D_DESC texDesc;
    d3dTexture->GetDesc(&texDesc);

    std::cout << "Format: " << texDesc.Format << "\n";
}

Для меня это возвращает 1, что соответствует DXGI_FORMAT_R32G32B32A32_TYPELESS. в соответствии с dxgiformat.h. Я работаю на GeForce GTX 1070 драйвер 416.34.

...