gpt4 book ai didi

c++ - DirectX 11 向后兼容性

转载 作者:行者123 更新时间:2023-11-28 02:40:56 28 4
gpt4 key购买 nike

我正在按照 here 中的代码示例学习 DirectX .我在代码集 1,第 6 章框代码示例。当我尝试在 DirectX 11 兼容机器上编译第 6 章的代码时,它运行良好,但是当我在带有着色器 5.0 的 DirectX 11 机器中的 directX 10 的 FEATURE LEVEL 中运行该代码时

    //d3App.cpp.
//In InitDirect3D() method

D3D_FEATURE_LEVEL a[]={D3D_FEATURE_LEVEL_10_0};
HRESULT hr = D3D11CreateDevice(
0, // default adapter
md3dDriverType,
0, // no software device
createDeviceFlags,
a, 1, // default feature level array
D3D11_SDK_VERSION,
&md3dDevice,
&featureLevel,
&md3dImmediateContext);

if( FAILED(hr) )
{
MessageBox(0, L"D3D11CreateDevice Failed.", 0, 0);
return false;
}

//if( featureLevel != D3D_FEATURE_LEVEL_11_0 )
//{
// MessageBox(0, L"Direct3D Feature Level 11 unsupported.", 0, 0);
// return false;
//}

然后在box.cpp中

    //Box.cpp       
//In BuildFX() method

HRESULT hr = D3DX11CompileFromFile(L"FX/color.fx", 0, 0, 0, "fx_5_0", shaderFlags,
0, 0, &compiledShader, &compilationMsgs, 0);

错误发生在

    //Box.cpp. Line 172
HR(mSwapChain->Present(0, 0));

如果我将着色器更改为具有 DirectX 10 的功能级别fx_4_0,它会在 DirectX 11 和 DirectX 10 中的交换链创建 失败机器。

此外,在 DirectX 10 机器中,如果我使用着色器 fx_5_0 在 DirectX 10 功能级别运行它,它不会给出错误,但它也不会执行任何操作。

是否可以使用 DirectX 11 API 构建与仅支持较低版本 DirectX 的机器兼容的应用程序?如果是儿子,directX 是自动处理还是我们必须自己处理?

最佳答案

您可能知道,只有 D3D_FEATURE_LEVEL_11_0 及更高版本支持着色器模型 5。所以您会认为使用着色器 fx_5_0 降低到 DX 10 将不起作用。然而,使用 DX 11 构建应用程序但支持较低版本的情况非常普遍。

包括您希望支持的每个版本。

static const D3D_FEATURE_LEVEL levels[] = {
D3D_FEATURE_LEVEL_11_1,
D3D_FEATURE_LEVEL_11_0,
D3D_FEATURE_LEVEL_10_1,
D3D_FEATURE_LEVEL_10_0,
D3D_FEATURE_LEVEL_9_3,
D3D_FEATURE_LEVEL_9_2,
D3D_FEATURE_LEVEL_9_1
};

注意:目前必须明确设置 D3D_FEATURE_LEVEL_11_1(如果需要,在没有 DX 11_1 的计算机上尝试使用该功能将失败并返回 E_INVALIDARG。

在使用调试信息进行编译时,包含调试标志很重要。通过简单地检查输出窗口来确定发生了什么将是一个巨大的帮助。那里会发送大量警告和特定错误信息。

unsigned flags = [YOUR FLAGS]; 

#ifdef _DEBUG
flags |= D3D11_CREATE_DEVICE_DEBUG;
#endif

此外,作为旁注,您可能需要考虑使用 Windows 运行时 ComPtr<>。随着您的项目变得越来越复杂,ComPtr<> 将有效且正确地处理资源。

Microsoft::WRL::ComPtr<ID3D11Device> d3dDevice = nullptr;
Microsoft::WRL::ComPtr<ID3D11DeviceContext> deviceContext = nullptr;
D3D_FEATURE_LEVEL selectedFeatureLevel;

HRESULT hr = D3D11CreateDevice(nullptr, D3D_DRIVER_TYPE_HARDWARE, nullptr, flags,
levels, ARRAYSIZE(levels), D3D11_SDK_VERSION,
d3dDevice.GetAddressOf(), &selectedFeatureLevel,
deviceContext.GetAddressOf()));

但是,由于着色器模型 5 仅受 D3D_FEATURE_LEVEL_11_0 及更高版本支持,因此请确保正确的文件格式。

编辑:另请注意,自您上面引用的书出版以来,最近的 D3D 开发中发生了相当多的变化。例如“D3DX11CreateTextureFromFile”已被弃用,并且有一些主题可用于迁移 XNA 代码。

希望对您有所帮助。

关于c++ - DirectX 11 向后兼容性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26018799/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com