2017-10-17 191 views
0

some part of code image,another part of code image,私は初心者ですDirectX 12(またはゲームプログラミング)とMicrosoftのドキュメントから勉強しています。機能ThrowIfFailed()を使用している間、私はヘッダーファイルにDirectX 12のThrowIfFailed()が含まれています

vs2015エディタのインテリセンスからエラーが出ます。この宣言には、ストレージクラスや型の指定子がありません。

誰でも手助けできます。

+0

をそれは、ヘッダの問題ではありません。あなたは単に関数の外にコードを書くだけです – Garf365

+0

何が起こっているかを見るためにコードを投稿してください。 – Garf365

+0

https://msdn.microsoft.com/en-us/library/windows/desktop/dn859356(v=vs.85) aspx LoadPipeline()funtion –

答えて

1

、私は強くすることはDirectX 11で始まるをお勧めしますではなくDirectX 12よりも優れています。 DirectX 12は、あなたがすでにDirectX 11のデベロッパーであることを前提としており、かなり寛容なAPIです。あなたがグラフィックスの開発者になることを計画しているなら、それは絶対に学ぶ価値がありますが、DX 12からDX 11を始めることは大きな仕事です。現代のDirectXのサンプルコードについてとVS DirectXのテンプレートでDX11および/またはDX12

ためのDirectXツールキットチュートリアルを参照してください、Microsoftは標準ヘルパー関数ThrowIfFailedを使用しています。 OSやシステムヘッダの一部ではありません。

#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値をチェックする必要があります。それはちょうどローカルプロジェクトのプリコンパイル済みヘッダーファイル(pch.h)で定義されています。特定のDirectX 11 APIまたはDirectX 12 APIの戻り値を無視するのが安全な場合は、代わりにvoidを返します。 「高速フェイル」シナリオでは、通常ThrowIfFailedを使用します(つまり、機能が失敗した場合、プログラムは回復できません)。

注意勧告は、VSテンプレートで設定するデフォルトのコンパイラであるC++ Exception Handling(別称、/EHsc)を使用することです。 x64およびARMプラットフォームでは、これは追加のコードオーバーヘッドなしで非常に効率的に実装されます。レガシーx86では、コンパイラが作成する追加のエピローグ/プロローグコードが必要です。ネイティブコードにおける例外処理に関する「FUD」の大部分は、コードオプティマイザを著しく妨げる古い非同期構造化例外処理(a.k.a. 012a)を使用した経験に基づいています。

さらに詳しい情報と使用方法については、this wiki pageを参照してください。 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); 
     } 
    } 
} 
+0

先生、DirectX11またはgithub用の本は十分ですか? –

+0

@ShivamKushwahaあなたはインターネット上でたくさんのチュートリアルを見つけることができます – Asesh

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))); 

ので、それを修正するために:あなたはDirectXのプログラミングに慣れていたよう

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))); 
関連する問題