我正在通过以下here中的代码示例来学习DirectX。我在Code Set 1,第6章Box代码示例中。当我尝试在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));
如果我使用fx_4_0
DirectX 10将着色器更改为feature level
,则在DirectX 11和DirectX 10计算机上的swap chain creation
处都会失败。
此外,在DirectX 10机器中,如果我使用着色器fx_5_0
在DirectX 10功能级别运行它,它不会发出错误但它也没有做任何事情。
是否可以使用与仅支持较低版本DirectX的机器兼容的DirectX 11 API构建应用程序?如果儿子,directX会自动处理它还是我们必须自己做?
答案 0 :(得分:2)
您可能知道,只有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开发中已经发生了相当大的变化。例如&#39; D3DX11CreateTextureFromFile&#39;已弃用,并且有可用于迁移XNA代码的主题。
我希望这会有所帮助。