0

代码图像的一部分,代码图像的 另一部分,我是DirectX 12(或游戏编程)的初学者并从 Microsoft 文档中学习。在使用函数时,我从vs2015ThrowIfFailed()的智能感知中得到一个错误编辑器

此声明没有存储类或类型说明符。

任何人都可以帮忙。

4

2 回答 2

1

由于您是 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);
        }
    }
}
于 2017-10-17T16:41:38.673 回答
0

此错误是因为您的某些代码在任何函数之外。

你的错误就在这里:

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)));
于 2017-10-17T13:32:43.670 回答