使用 DirectX,您可以将图像显示为带有纹理的四边形(矩形),并根据需要修改纹理(作为图像)。
您可以使用任何 DX (9,10,11,12) 来执行此操作,但仅显示 256x256 像素的图像需要大量工作。
这里有实现此目的的示例:https://github.com/microsoft/DirectXTK/wiki/Getting-Started,
特别是精灵和纹理https://github.com/microsoft/DirectXTK/wiki/Sprites-and-textures。
您可以在这里获得帮助:https://github.com/microsoft/DirectXTK/wiki/DeviceResources。
然而,我发现该示例并不能直接显示经过计算的图像。
如果您正在寻找可能的最低延迟(亚毫秒),或者能够以 10 位显示(您只能使用 DX),拥有支持 cuda 的 GPU,您可以在使用 DX12 的 GPU:https://github.com/mprevot/CudaD3D12Update。
这是一个 cuda-DX12 互操作的案例。在这种情况下,您可以最大限度地减少 CPU 和 GPU 之间的来回,因为纹理是在 GPU 中计算和显示的。 CPU 仅用于编排事件。
四边形定义为as such:
TexVertex quadVertices[] =
{
{ {-x,-y, 0.0f }, { 0.0f, 0.0f } },
{ {-x, y, 0.0f }, { 0.0f, 1.0f } },
{ {x, -y, 0.0f }, { 1.0f, 0.0f } },
{ {x, y, 0.0f }, { 1.0f, 1.0f } },
};
然后是uploaded。纹理是这样定义的:
TextureChannels = 4;
TextureWidth = m_width;
TextureHeight = m_height;
const auto textureSurface = TextureWidth * TextureHeight;
const auto texturePixels = textureSurface * TextureChannels;
const auto textureSizeBytes = sizeof(float)* texturePixels;
const auto texFormat = TextureChannels == 4 ? DXGI_FORMAT_R32G32B32A32_FLOAT : DXGI_FORMAT_R32G32B32_FLOAT;
const auto texDesc = CD3DX12_RESOURCE_DESC::Tex2D(texFormat, TextureWidth, TextureHeight, 1, 1, 1, 0, D3D12_RESOURCE_FLAG_ALLOW_SIMULTANEOUS_ACCESS);
ThrowIfFailed(m_device->CreateCommittedResource(&CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_DEFAULT), D3D12_HEAP_FLAG_SHARED,
&texDesc, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE, nullptr, IID_PPV_ARGS(&TextureArray)));
NAME_D3D12_OBJECT(TextureArray);
那么DX12贴图是imported into cuda as a surface,然后你run a kernel(或者DX语言的shader)来修改。好处是您不必以预定义的频率更新它,表面可以随意更新和显示,只有这样。
如果您没有 cuda GPU,您可以从 CPU 更改纹理(参见 DX 示例)。
但是,即使您没有要求这样做,我相信使用诸如 WPF 框架之类的东西来显示(和计算)此类图像会更容易,延迟会更大但非常可接受,并且您只能显示 8 位图像。在后面的 WPF 依赖于 DX,但据我所知,无法修改其配置。这是获得结果并尽快处理的方法。