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);
}
}
}
Ce n'est pas question d'en-tête. Vous écrivez simplement le code en dehors de toute fonction – Garf365
S'il vous plaît poster votre code pour nous aider à voir ce qui se passe – Garf365
https://msdn.microsoft.com/en-us/library/windows/desktop/dn859356(v=vs.85). aspx Son écrit à l'intérieur de la fonction LoadPipeline() –