获取 D3D 设备
前面讲过在创建渲染器时可以指定图像引擎,例如在 Windows 平台下可以指定使用 D3D11:
SDL_Renderer* renderer = SDL_CreateRenderer(window, "direct3d11");
创建渲染器成功后可以通过 SDL_GetRendererProperties 取出内部的 D3D 设备接口:
ComPtr<ID3D11Device> d3d11_device = static_cast<ID3D11Device*>(SDL_GetPointerProperty(
SDL_GetRendererProperties(renderer), SDL_PROP_RENDERER_D3D11_DEVICE_POINTER, nullptr));
遗憾的是我们无法在外部创建 D3D 设备然后传递给 SDL 用来创建渲染器,也没有更多的 D3D 创建参数可以设置,这导致一些特殊需求无法实现。比如说系统有两张显卡时无法自由的选择使用哪张显卡而只能使用默认的。不过无论如何,SDL3 能指定图形引擎和取出 D3D 设备已经是一个巨大的进步。
更重要的一个特性是我们可以使用类似的方式从 SDL 纹理中取出原始的 D3D 纹理或者把已有的 D3D 纹理包装成 SDL 纹理然后交给 SDL 渲染器执行渲染。这个特性非常重要,因为这意味着我们可以丝滑的把已有的 D3D 渲染代码和 SDL 结合起来使用,这在 SDL2 里是做不到的。
接下来我们用一个简单的例子来做演示。
渲染 D3D 纹理
首先使用前面拿到的 d3d11_device 创建一个 2D 纹理并填充图像数据,依然是 2x2 大小,SDL_PIXELFORMAT_ARGB8888 格式,对应 D3D 中的 DXGI_FORMAT_B8G8R8A8_UNORM 格式:
ComPtr<ID3D11Texture2D> d3d11_texture = CreateTexture2D(d3d11_device.Get(), 2, 2);
if (

2426

被折叠的 条评论
为什么被折叠?



