Steam distributes Blender and Autodesk distributes 3D Studio, Maya and AutoCAD. These tools are the most widely used ones for creating 3D game worlds.

Blender is open source and it has a large community of contributors. Many game studios have used Blender successfully.

DX12 uses multiple GPU cards to manage rendering and this makes it more tricky for engine developers to cope.

Of course using D3D12CreateDevice () for new code is best as D3D11CreateDevice () needs an enumeration to select a suitable GPU. Calling ths with NULL will give the default adapter.

NOTE: Don’t mix the use of DXGI 1.0 (IDXGIFactory) and DXGI 1.1 (IDXGIFactory1) in an application. Use IDXGIFactory or IDXGIFactory1, but not both in an application.

//Find the first DX12 hardware adapter.
void GetHardwareAdapter(IDXGIFactory4* pFactory, IDXGIAdapter1** ppAdapter) {
 *ppAdapter = nullptr;
 for (UINT adapterIndex = 0; ; ++adapterIndex) {
 IDXGIAdapter1* pAdapter = nullptr;
 if (DXGI_ERROR_NOT_FOUND == pFactory->EnumAdapters1(adapterIndex, &pAdapter)) {
 // No more adapters to enumerate.
 break; }

// Check to see if the adapter supports Direct3D 12, but don't create the
 // actual device yet.
 if (SUCCEEDED(D3D12CreateDevice(pAdapter, D3D_FEATURE_LEVEL_11_0, _uuidof(ID3D12Device), nullptr))) {
 *ppAdapter = pAdapter;

By using better coding practices a game developer can easily make sure the DX12 capabilities are used properly.

AMD and NVIDA both have SDK packages galore for developers. Some care is needed to be sure that any product runs reasonable well on either vendors cards.