首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c++ direct3d 2d渲染

c++ direct3d 2d渲染
EN

Stack Overflow用户
提问于 2021-01-06 23:44:18
回答 2查看 209关注 0票数 1

我想知道你对以下问题有什么建议:

我所需要的就是在win32窗口中显示一个表面。假设256 * 256 xRGB,我需要访问内存才能将像素放入其中。我对Direct3d9的看法很正确,但它太旧了。我知道在Dirct3D 10和11中有不同的方式来做同样的事情,但它涉及到玩3d东西吗?我在direct3D9中使用了Direct3D10 ->Lock(),但在较新的版本中它不可用。

所以说,如果我必须使用一个库(如SDL),我不能直接调用它来锁定表面并在win32窗口中显示。有没有一些应用编程接口可以在d3d中进行2d渲染,或者我必须进入direct3d 10或11,然后才能以3d的方式进行渲染?

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

EN

回答 2

Stack Overflow用户

发布于 2021-01-07 00:36:29

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

您可以使用任何DX (9,10,11,12)来完成此操作,但仅显示256x256像素的图像需要大量工作。

这里有实现这一点的示例:https://github.com/microsoft/DirectXTK/wiki/Getting-Started,特别是sprites和texture https://github.com/microsoft/DirectXTK/wiki/Sprites-and-textures

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

然而,我发现样本并不能直接显示计算出来的图像。

如果你正在寻找可能的最低延迟(亚毫秒),或者能够以10位显示(你只能使用DX),有一个支持cuda的图形处理器,你可以用DX12:https://github.com/mprevot/CudaD3D12Update在图形处理器中显示和修改图像。

这是一个cuda-DX12互操作的例子。在这种情况下,您可以最小化CPU和GPU之间的来回,因为纹理是在GPU中计算和显示的。CPU只是在这里编排事件。

四元组被定义为as such:

代码语言:javascript
复制
    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。纹理的定义如下:

代码语言:javascript
复制
    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语言中的着色器)对其进行修改。好的是,你不必以预先定义的频率更新它,曲面可以按自己的意愿更新和显示,只有这样。

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

然而,即使你没有要求这样做,我相信使用像WPF框架这样的东西来显示(和计算)这样的图像会更容易,延迟会大得多,但非常可以接受,并且你只能显示8位图像。在后面,WPF依赖于DX,但据我所知,一个人不能修改它的配置。这就是获得结果并尽快发挥作用的方法。

票数 2
EN

Stack Overflow用户

发布于 2021-01-07 00:00:09

我所需要的就是在win32窗口中显示一个曲面。假设256 * 256 xRGB,我需要访问内存才能将像素放入其中。

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

我知道在Dirct3D 10和11中有不同的方式来做同样的事情,但是它涉及到玩3d东西吗?

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

我在direct3D9中使用了

->Lock(),但在较新的版本中不可用。

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

So说,如果我必须使用库(如SDL),而我不能直接调用它来锁定表面并显示在win32窗口中

您的意思是,SDL是基本3D APIs /D3D之上的一个层。它支持他们所支持的一切。具体来说,锁定SDL纹理是使用SDL_LockTexture完成的。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65598859

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档