我想知道你对以下问题有什么建议:
我所需要的就是在win32窗口中显示一个表面。假设256 * 256 xRGB,我需要访问内存才能将像素放入其中。我对Direct3d9的看法很正确,但它太旧了。我知道在Dirct3D 10和11中有不同的方式来做同样的事情,但它涉及到玩3d东西吗?我在direct3D9中使用了Direct3D10 ->Lock(),但在较新的版本中它不可用。
所以说,如果我必须使用一个库(如SDL),我不能直接调用它来锁定表面并在win32窗口中显示。有没有一些应用编程接口可以在d3d中进行2d渲染,或者我必须进入direct3d 10或11,然后才能以3d的方式进行渲染?
我已经用谷歌搜索过了,我有点迷路了。欢迎任何建议。
发布于 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:
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语言中的着色器)对其进行修改。好的是,你不必以预先定义的频率更新它,曲面可以按自己的意愿更新和显示,只有这样。
如果您没有cuda GPU,您可以从CPU更改纹理(参见DX示例)。
然而,即使你没有要求这样做,我相信使用像WPF框架这样的东西来显示(和计算)这样的图像会更容易,延迟会大得多,但非常可以接受,并且你只能显示8位图像。在后面,WPF依赖于DX,但据我所知,一个人不能修改它的配置。这就是获得结果并尽快发挥作用的方法。
发布于 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完成的。
https://stackoverflow.com/questions/65598859
复制相似问题