0
votes

Aucun constructeur approprié n'existe de convertir du "flotteur" en "_d3dcolorvalue"

J'essaie actuellement d'apprendre DirectX 11 à l'aide de C ++ dans Visual Studio 2017 et rencontrez un problème.

#include <Windows.h>
#include <windowsx.h>
#include <d3d11.h>
#include <d3d12.h>
#include <d3dcompiler.h>

// include D3D Librararies
#pragma comment (lib, "d3d11.lib")
#pragma comment (lib, "d3d12.lib")
#pragma comment (lib, "D3DCompiler.lib")

// Definitions
#define SCREEN_WIDTH    800
#define SCREEN_HEIGHT   600

// Global Declarations
IDXGISwapChain *swapchain;              // Pointer to Swap Chain Buffer
ID3D11DeviceContext *devcon;            // Pointer to managing Device for GPU
ID3D11Device *dev;                      // Pointer to GPU
ID3D11RenderTargetView *backBuffer;     // A pointer to an object that holds info about the render target
ID3D11VertexShader *pVS;                // The Vertex shader
ID3D11PixelShader *pPS;                 // The Pixel Shader


struct VERTEX {
   FLOAT X, Y, Z;           // Position
   D3DCOLORVALUE Color; // Color
};

// float color2[4] = { 1.0f, 0.0f, 0.0f, 1.0f };
VERTEX OurVertex = { 0.0f, 0.5f, 0.0f,  D3DCOLORVALUE(1.0f, 0.0f, 0.0f, 1.0f)}; // No suitable constructor exists to convert from "float" to "_D3DCOLORVALUE"


3 commentaires

Qu'en est-il de sommet Ourvertex = {0.0F, 0.5F, 0.0F, D3DColorvalue {1.0F, 0.0F, 0.0F, 1.0F}}; ?


Merci, ça a fonctionné. Ainsi, les accolades bouclées sont utilisées pour D3DColorValue. Je garderai cela à l'esprit.


Vérifiez la documentation, _d3dcolorvalue est un struct , vous devez donc probablement le faire comme d3dcolorvalue {1.0f, 0.0f, 0.0f, 1.0f}


3 Réponses :


0
votes

d3dcolorvalue code> n'a pas de constructeur prise 4 float code> s. Vous devriez utiliser Initialisation de la liste :

VERTEX OurVertex = {0.0f, 0.5f, 0.0f,  {1.0f, 0.0f, 0.0f, 1.0f}};


0 commentaires

0
votes

@tedlyngmo Ted a essentiellement dit tout ce que vous devriez faire cela.

Cependant, en fonction de votre commentaire plus tôt,

Les bretelles bouclées sont utilisées pour D3DColorValue. Je garderai cela à l'esprit

Vous semblez y penser comme un cas particulier. Au lieu de cela, la manière de comprendre cela devrait être de savoir si vous appelez une fonction ou que vous créez un objet.

avec moderne C ++ S, l'initialisation de la liste est préférée dans la plupart des cas. Consultez cette question: Pourquoi l'initialisation de la liste est-elle bretelles bouclées) mieux que les alternatives?

Fondamentalement, le temps que vous puissiez utiliser MyClass ObjectName {myvalues}; pour déclarer un objet, ou myClass {myvalues}; si vous souhaitez créer une temporaire. De sorte que les parenthèses pouvaient être réservées aux appels de fonction ou aux objets avec std :: initialisizer_list ctors.


0 commentaires

0
votes

Gardez à l'esprit que d3dcolorvalue est spécifiquement une construction Direct3D 9. Beaucoup de gens utiliseront quatre flotteurs pour la couleur par sommet (au moins lors de la démarrage), mais si vous vouliez utiliser un format de couleur emballé, le DirectXMath Type XMColor dans le DirectX :: EmbackEdVector Espace de noms correspond à l'ancien D3DColorValue .

Pour Direct3D 11 Fonctions qui prennent une matrice de quatre flotteurs pour la couleur (telle que ClearRenderTregeview , DirectXMath définit également un certain nombre de constantes de couleur dans le DirectXColors.h en-tête .

Comme vous êtes nouveau à DirectX 11, consultez Kit d'outil DirectX .


0 commentaires