繁体   English   中英

c++ direct3d 2d 渲染

[英]c++ direct3d 2d rendering

我想知道您对以下问题的建议:

我所需要的只是在 win32 window 中显示一个表面。 说 256 * 256 xRGB,我需要访问 memory 以将像素放入其中。 我对 Direct3d9 非常正确,但是 API 是旧的。 我知道在 Dirct3D 10 和 11 中有不同的方法可以做同样的事情,但它是否涉及玩 3d 的东西? 我认为在 Direct3D10 或 11 中无法做到这一点。我在 direct3D9 中使用了 surface->Lock(),但它在较新的版本中不可用。

所以,如果我必须使用我不能直接调用的库(如 SDL)来锁定表面并显示在 win32 window 中。 是否有一些 api 在 d3d 中进行 2d 渲染,还是我必须进入 direct3d 10 或 11 并在 3d 中以艰难的方式进行?

我用谷歌搜索了它,我有点迷路了。 欢迎任何建议。

使用 DirectX,您可以将图像显示为带有纹理的四边形(矩形),并根据需要修改纹理(作为图像)。

您可以使用任何 DX (9,10,11,12) 来执行此操作,但仅显示 256x256 像素的图像需要做很多工作。

在这里,您有实现此目的的示例: https://github.com/microsoft/DirectXTK/wiki/Getting-Started ,特别是精灵和纹理https://github.com/microsoft/DirectXTK/wiki/Sprites-and-纹理

您可以在这里获得一些帮助: https://github.com/microsoft/DirectXTK/wiki/DeviceResources

但是,我发现该示例并不能直接显示计算的图像。

如果您正在寻找可能的最低延迟(亚毫秒),或者能够以 10 位显示(您只能使用 DX),启用 cuda GPU 您可以在 Z532F9EC21373074 中显示和修改所有图像DX12: https://github.com/mprevo/CudaD3D12Update

这是一个 cuda-DX12 互操作的案例。 在这种情况下,您可以最大限度地减少 CPU 和 GPU 之间的来回,因为纹理是在 GPU 中计算和显示的。 CPU 仅用于编排事件。

四边形定义如下:

    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 } },
    };

然后上传 纹理定义如下:

    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 纹理导入 cuda 作为表面,然后运行 kernel (或 DX 语言中的着色器)对其进行修改。 好处是您不必以预定义的频率更新它,表面可以随意更新和显示,只有这样。

如果您没有 cuda GPU,您可以从 CPU 更改纹理(参见 DX 示例)。

然而,即使你没有要求这个,我相信使用类似 WPF 框架来显示(和计算)这样的图像会更容易,延迟会更大但非常可接受,你只能显示 8 位图像。 在后面 WPF 是依赖 DX,但据我所知,无法修改其配置。 这就是 go 获得结果并尽快使用该结果的方法。

我所需要的只是在 win32 window 中显示一个表面。 说 256 * 256 xRGB,我需要访问 memory 以将像素放入其中。

如果这就是你所需要的,我建议你坚持使用 GDI/GDI+。 它的性能较低,因为它是完全软件实现的,但它非常易于使用。

我知道在 Dirct3D 10 和 11 中有不同的方法可以做同样的事情,但它是否涉及玩 3d 的东西?

仅限于设置 2D 投影(默认设置)。

我在 direct3D9 中使用了 surface->Lock(),但在较新的版本中不可用。

上传资源数据的现代方式是使用ID3D12Resource::Map

所以,说如果我必须使用我不能直接调用的库(如 SDL)来锁定表面并在 win32 window 中显示

你是什么意思,SDL 是基本 3D API、OGL/D3D 之上的一层。 它支持他们支持的一切。 具体来说,锁定 SDL 纹理是使用SDL_LockTexture完成的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM