2017-10-17 9 views
0

some part of code image,another part of code image, Je suis débutant à DirectX 12 (ou Programmation de jeu) et étudie à partir de la documentation de Microsoft. Tout en utilisant la fonction ThrowIfFailed() je reçois une erreur de IntelliSense de vs2015 éditeurquel fichier d'en-tête contient ThrowIfFailed() dans DirectX 12

Cette déclaration n'a pas de classe de stockage ou du prescripteur de type.

Quelqu'un peut-il aider.

+0

Ce n'est pas question d'en-tête. Vous écrivez simplement le code en dehors de toute fonction – Garf365

+0

S'il vous plaît poster votre code pour nous aider à voir ce qui se passe – Garf365

+0

https://msdn.microsoft.com/en-us/library/windows/desktop/dn859356(v=vs.85). aspx Son écrit à l'intérieur de la fonction LoadPipeline() –

Répondre

1

Comme vous débutez en programmation DirectX, je fortement vous recommandons de commencer avec DirectX 11 plutôt que DirectX 12. DirectX 12 suppose que vous êtes déjà un développeur expert de DirectX 11 et qu'il s'agit d'une API très impitoyable. Il vaut la peine d'apprendre si vous envisagez d'être un développeur graphique, mais commencer avec DX 12 sur DX 11 est une entreprise énorme. Voir les tutoriels outils DirectX Kit pour DX11 et/ou DX12

Pour le code moderne exemple de DirectX et dans les modèles VS DirectX, Microsoft utilise une fonction d'assistance norme ThrowIfFailed. Cela ne fait pas partie du système d'exploitation ou des en-têtes du système; il est juste défini dans le projet local de fichier en-tête précompilé de (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(); 
     } 
    } 
} 

Pour la programmation COM, vous devez vérifier lors de l'exécution toutes HRESULT valeurs pour l'échec. S'il est possible d'ignorer la valeur de retour d'une API DirectX 11 ou DirectX 12 particulière, elle renvoie void à la place. Vous utilisez généralement ThrowIfFailed pour les scénarios d'échec rapide (c'est-à-dire que votre programme ne peut pas récupérer si la fonction échoue).

Notez la recommandation est d'utiliser C++ Exception Handling (/EHsc a.k.a.) qui est le paramètre par défaut du compilateur dans les modèles VS. Sur les plates-formes x64 et ARM, ceci est implémenté très efficacement sans surcharge de code supplémentaire. Legacy x86 nécessite un code epilog/prologue supplémentaire que le compilateur crée. La plupart du "FUD" autour de la gestion des exceptions dans le code natif est basé sur l'expérience de l'utilisation de l'ancienne gestion des exceptions structurées asynchrones (a.k.a. /EHa) qui entrave gravement l'optimiseur de code.

Voir this wiki page pour plus de détails et d'informations sur l'utilisation. Vous devriez également lire la page sur ComPtr.

Dans ma version des modèles de jeux Direct3D VS sur GitHub, j'utilise une version légèrement améliorée de ThrowIfFailed que vous pouvez également utiliser:

#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

Monsieur, recommandez-vous un livre pour DirectX11 ou github est suffisant? –

+0

@ShivamKushwaha Vous pouvez trouver beaucoup de tutoriels sur internet – Asesh

0

Cette erreur est due au fait que certains de vos codes sont en dehors de toute fonction.

Votre erreur est juste ici:

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

Donc, pour corriger:

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