代码图像的一部分,代码图像的 另一部分,我是DirectX 12(或游戏编程)的初学者并从 Microsoft 文档中学习。在使用函数时,我从vs2015ThrowIfFailed()
的智能感知中得到一个错误编辑器
此声明没有存储类或类型说明符。
任何人都可以帮忙。
代码图像的一部分,代码图像的 另一部分,我是DirectX 12(或游戏编程)的初学者并从 Microsoft 文档中学习。在使用函数时,我从vs2015ThrowIfFailed()
的智能感知中得到一个错误编辑器
此声明没有存储类或类型说明符。
任何人都可以帮忙。
由于您是 DirectX 编程的新手,我强烈建议您从 DirectX 11 而不是 DirectX 12 开始。DirectX 12 假定您已经是 DirectX 11 的专家开发人员,并且是一个非常无情的 API。如果您打算成为一名图形开发人员,这绝对值得学习,但是从 DX 12 开始而不是 DX 11 是一项艰巨的任务。请参阅DX11和/或DX12的DirectX 工具包教程
对于现代 DirectX 示例代码和 VS DirectX 模板,Microsoft 使用标准帮助函数ThrowIfFailed
。它不是操作系统或系统头文件的一部分;它只是在本地项目的预编译头文件 ( pch.h
) 中定义的:
#include <exception>
namespace DX
{
inline void ThrowIfFailed(HRESULT hr)
{
if (FAILED(hr))
{
// Set a breakpoint on this line to catch DirectX API errors
throw std::exception();
}
}
}
对于 COM 编程,您必须在运行时检查所有HRESULT
值是否失败。如果忽略特定 DirectX 11 或 DirectX 12 API 的返回值是安全的,它将void
改为返回。您通常ThrowIfFailed
用于“快速失败”场景(即,如果功能失败,您的程序将无法恢复)。
请注意,建议使用C++ 异常处理(aka
/EHsc
),这是 VS 模板中的默认编译器设置。在 x64 和 ARM 平台上,这可以非常有效地实现,无需任何额外的代码开销。旧版 x86 需要编译器创建的一些额外的 Epilog/prologue 代码。本机代码中围绕异常处理的大多数“FUD”都是基于使用旧的异步结构化异常处理(aka/EHa
)的经验,这严重阻碍了代码优化器。
有关更多详细信息和使用信息,请参阅此 wiki 页面。您还应该阅读ComPtr上的页面。
在我在GitHub 上的 Direct3D 游戏 VS 模板版本中,我使用了稍微增强的版本ThrowIfFailed
,您也可以使用它:
#include <exception>
namespace DX
{
// Helper class for COM exceptions
class com_exception : public std::exception
{
public:
com_exception(HRESULT hr) : result(hr) {}
virtual const char* what() const override
{
static char s_str[64] = {};
sprintf_s(s_str, "Failure with HRESULT of %08X",
static_cast<unsigned int>(result));
return s_str;
}
private:
HRESULT result;
};
// Helper utility converts D3D API failures into exceptions.
inline void ThrowIfFailed(HRESULT hr)
{
if (FAILED(hr))
{
throw com_exception(hr);
}
}
}
此错误是因为您的某些代码在任何函数之外。
你的错误就在这里:
void D3D12HelloTriangle::LoadPipeline() {
#if defined(_DEBUG) { //<= this brack is simply ignore because on a pre-processor line
ComPtr<ID3D12Debug> debugController;
if (SUCCEEDED(D3D12GetDebugInterface(IID_PPV_ARGS(&debugController)))) {
debugController->EnableDebugLayer();
}
} // So, this one closes method LoadPipeline
#endif
// From here, you are out of any function
ComPtr<IDXGIFactory4> factory;
ThrowIfFailed(CreateDXGIFactory1(IID_PPV_ARGS(&factory)));
所以要纠正它:
void D3D12HelloTriangle::LoadPipeline() {
#if defined(_DEBUG)
{ //<= just put this bracket on it's own line
ComPtr<ID3D12Debug> debugController;
if (SUCCEEDED(D3D12GetDebugInterface(IID_PPV_ARGS(&debugController)))) {
debugController->EnableDebugLayer();
}
} // So, this one close method LoadPipeline
#endif
// From here, you are out of any function
ComPtr<IDXGIFactory4> factory;
ThrowIfFailed(CreateDXGIFactory1(IID_PPV_ARGS(&factory)));