IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

DirectX Discussion :

[C++.NET][DX9] pas moyen d'afficher un triangle


Sujet :

DirectX

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    487
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 487
    Points : 621
    Points
    621
    Par défaut [C++.NET][DX9] pas moyen d'afficher un triangle
    Je découvre DirectX et j'essaie de transcrire les tutorials existant pour C# en C++ managé.
    J'utilise Visual C++ 2005 Express Edition et DirectX for Managed Code V2.0 (beta) incluse dans le dernier SDK de décembre.
    La syntaxe change un peu mais c'est encore compréhensible.
    Mon problème est simple : impossible d'afficher ce p* de triangle qu'on trouve à la page 3 de tous les tutorials.
    Soit il y a un bug dans DirectX, soit quelque chose m'échappe.
    device->Clear fonctionne bien avec toutes les couleurs et le débuggeur montre que le vertexBuffer contient bien les vertex dans OnPaint()...

    Voilà mon code(le plus simple possible) si quelqu'un a une idée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    	public ref class Form1 : public System::Windows::Forms::Form
    	{
    	public:
    		Form1(void)
    		{
    			InitializeComponent();
    			this->SetStyle (ControlStyles::AllPaintingInWmPaint, true);
    			InitializeDirectX();
    			}
     
    	protected:
    		/// <summary>
    		/// Clean up any resources being used.
    		/// </summary>
    		~Form1()
    		{
    			delete device;
    			if (components)
    			{
    				delete components;
    			}
    		}
     
    	private:
    		/// <summary>
    		/// Required designer variable.
    		/// </summary>
    		System::ComponentModel::Container ^components;
     
    #pragma region Windows Form Designer generated code
    		/// <summary>
    		/// Required method for Designer support - do not modify
    		/// the contents of this method with the code editor.
    		/// </summary>
    		void InitializeComponent(void)
    		{
    		this->SuspendLayout();
    		// 
    		// Form1
    		// 
    		this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
    		this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
    		this->ClientSize = System::Drawing::Size(737, 629);
    		this->Name = L"Form1";
    		this->Text = L"Form1";
    		this->ResumeLayout(false);
     
    			}
    #pragma endregion
     
    	protected:
    	Device^ device;
    	VertexBuffer^ myVertexBuffer;
     
    	protected:
    	bool InitializeDirectX() {
    		// Now  setup our D3D stuff
    		PresentParameters^ presentParams = gcnew PresentParameters();
    		presentParams->IsWindowed = true;
    		presentParams->SwapEffect = SwapEffect::Discard;
    		device = gcnew Device(0, DeviceType::Hardware, this->Handle, 
    								CreateFlags::SoftwareVertexProcessing, presentParams);
    		device->RenderState->CullMode = Cull::None;
    		device->VertexFormat = CustomVertex::TransformedColored::Format;
    		device->DeviceReset += gcnew EventHandler(this, &Form1::OnResetDevice);
    		this->OnResetDevice(device, EventArgs::Empty);
    		return true;
    		}
    	void OnResetDevice(Object^ sender, EventArgs^ e){
    		Device^ dev = (Device^)sender;
    		//Créer le vertex buffer pour 3 CustomVertex::TransformedColored 
    		//OnCreateVertexBuffer() est appelé par ce constructeur
    		myVertexBuffer = gcnew VertexBuffer(dev, 3*CustomVertex::TransformedColored::StrideSize,
    			Usage::None, CustomVertex::TransformedColored::Format, Pool::Default,
    			gcnew EventHandler(this, &Form1::OnCreateVertexBuffer));
    		}
    	void OnCreateVertexBuffer(Object^ sender, EventArgs^ e){
    		VertexBuffer^ vb = dynamic_cast<VertexBuffer^>(sender);
    		//insérer les sommets dans le buffer
    		DirectX::Generic::GraphicsBuffer<CustomVertex::TransformedColored>^ buffer;
    		buffer = vb->Lock<CustomVertex::TransformedColored>(0, 3, LockFlags::None);
    		buffer[0] = CustomVertex::TransformedColored(20, 20, 0.5f, 1, Color::Aqua);
    		buffer[1] = CustomVertex::TransformedColored(100, 20, 0.5f, 1, Color::Beige);
    		buffer[2] = CustomVertex::TransformedColored(50, 100, 0.5f ,1, Color::OrangeRed);
    		vb->Unlock();
    		}
    	virtual void OnPaint(PaintEventArgs^ e) override{
    			if (device == nullptr) 
    				return;
    			device->Clear(ClearFlags::Target, Color::Black, 1.0f, 0);
    			device->BeginScene();
     
    			device->SetStreamSource(0, myVertexBuffer, 0);
    			device->VertexFormat = CustomVertex::TransformedColored::Format;
    			device->DrawPrimitives(PrimitiveType::TriangleList, 0, 1);
     
    			device->EndScene();
    			device->Present();
    			}
     
    		};
    On ne peut pas faire boire un âne qui n'a pas soif.

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 73
    Points : 69
    Points
    69
    Par défaut
    Initialise ta matrice de projection...

    ex :
    D3DXMatrixPerspectiveFovLH(&projection_matrix, D3DX_PI / 4.0f,(float) 800/600,1, 1000);
    Direct3D_device->SetTransform(D3DTS_PROJECTION,&projection_matrix);

  3. #3
    Membre habitué Avatar de Mandalar
    Profil pro
    Étudiant
    Inscrit en
    Mai 2004
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2004
    Messages : 121
    Points : 128
    Points
    128
    Par défaut
    A priori tu devrais placer tes vertices dans l'ordre des aiguilles d'une montre:
    Citation Envoyé par sdk directx
    A front face is one in which vertices are defined in clockwise order.
    Ce qui te donnerait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    buffer[0] = CustomVertex::TransformedColored(20, 20, 0.5f, 1, Color::Aqua);
    buffer[1] = CustomVertex::TransformedColored(50, 100, 0.5f ,1, Color::OrangeRed); 
    buffer[2] = CustomVertex::TransformedColored(100, 20, 0.5f, 1, Color::Beige);
    J'espère que ca suffira!

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    487
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 487
    Points : 621
    Points
    621
    Par défaut
    Citation Envoyé par Mandalar
    A priori tu devrais placer tes vertices dans l'ordre des aiguilles d'une montre:
    En fait j'ai déjà essayé. En plus le culling est désactivé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    device->RenderState->CullMode = Cull::None;

    Citation Envoyé par Omeyocan
    Initialise ta matrice de projection...
    Normalement, il n'y a pas de projection puisque j'utilise des vertices déjà transformés (en coord écran) TransformedColored.
    Je peux essayer quand même ...
    On ne peut pas faire boire un âne qui n'a pas soif.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 73
    Points : 69
    Points
    69
    Par défaut
    Citation Envoyé par NicolasG
    Normalement, il n'y a pas de projection puisque j'utilise des vertices déjà transformés (en coord écran) TransformedColored.
    Je peux essayer quand même ...
    Si y'a toujours besoin d'une projection... tes points sont situés dans l'espace, si tu ne positionne pas correctement la caméra, tu peux tres bien regarder a l'opposé de ton triangle, ou etre au dessus ou en dessous...

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    487
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 487
    Points : 621
    Points
    621
    Par défaut
    Je maintient qu'il n'y a pas de transformation. J'ai consulté la doc disponible et plusieurs tutorials.
    Le problème est que j'utilise une version beta de Managed DirectX qui n'est pas encore documentée. Donc, soit c'est un bug, soit il y a une propriétée inconnue a initialiser.
    Les exemples fournis avec le SDK fonctionnent avec d'autres assembly (v1.0...).
    Conclusion : je vais attendre la version suivante.

    Merci d'avoir pris le temps de me répondre.
    On ne peut pas faire boire un âne qui n'a pas soif.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 73
    Points : 69
    Points
    69
    Par défaut
    Je te suggere quand meme d'essayer d'initialiser une matrice de projection, rien que pour voir...
    Tes points ont des coordonnées X Y Z dans l'espace, ce ne sont pas des coordonnés écrans... pour en faire des coordonnée écran, il te faudrait une matrice de projection orthogonale correctement configurée... pour moi, ca ne peux pas fonctionner sans matrice de projection... si la matrice de projection est 0, tes vertex ne pourrons jamais etre projeté sur le plan de ton backbuffer...

  8. #8
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Les vertices de type "transformés" sont, comme leur nom l'indique, déjà transformés. Ils ne passeront pas par la case "transformation" du pipeline, donc tu peux mettre tout ce que tu veux comme matrice de projection, ça ne leur fera ni chaud ni froid. C'est également pour cela qu'ils ont non pas 3 coordonnées, mais 4 (X, Y, Z, W).

    Utiliser des coordonnées RHW (on les appelle souvant comme ça) est l'une des 2 manières d'afficher de la 2D -- avec les matrices de projection ortho donc.

    Regarde la doc du SDK si tu n'en es pas convaincu.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 73
    Points : 69
    Points
    69
    Par défaut
    Je voudrais bien voir la partie du SDK qui affirme ça... la coordonné W n'est à ma connaissance qu'une information de poids... (utile pour le skinning ou ce genre de chose)... ca ne prive pas ce vertex de transformation et encore moins de projection... La projection n'est pas une transformation... c'est une projection... moi ce que je comprends c'est que le vertex n'est pas transformé via la matrice WORLD, mais à mon avis, il est projeté comme tout autre vertex...

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    487
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 487
    Points : 621
    Points
    621
    Par défaut
    Citation Envoyé par Loulou24
    Les vertices de type "transformés" sont, comme leur nom l'indique, déjà transformés. Ils ne passeront pas par la case "transformation" du pipeline, donc tu peux mettre tout ce que tu veux comme matrice de projection, ça ne leur fera ni chaud ni froid. C'est également pour cela qu'ils ont non pas 3 coordonnées, mais 4 (X, Y, Z, W).

    Utiliser des coordonnées RHW (on les appelle souvant comme ça) est l'une des 2 manières d'afficher de la 2D -- avec les matrices de projection ortho donc.

    Regarde la doc du SDK si tu n'en es pas convaincu.
    +1
    On ne peut pas faire boire un âne qui n'a pas soif.

  11. #11
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Je voudrais bien voir la partie du SDK qui affirme ça...
    Fais une recherche sur D3DDECLUSAGE_POSITIONT ou D3DFVF_XYZRHW par exemple.

    Citation Envoyé par La documentation du SDK
    D3DDECLUSAGE_POSITIONT
    Vertex data contains transformed position data ranging from (0,0) to (viewport width, viewport height). Use D3DDECLUSAGE_POSITIONT with a usage index of 0 to specify transformed position. When a declaration containing this is set, the pipeline does not perform vertex processing
    la coordonné W n'est à ma connaissance qu'une information de poids... (utile pour le skinning ou ce genre de chose)... ca ne prive pas ce vertex de transformation et encore moins de projection... La projection n'est pas une transformation... c'est une projection... moi ce que je comprends c'est que le vertex n'est pas transformé via la matrice WORLD, mais à mon avis, il est projeté comme tout autre vertex...
    Ben moi je voudrais bien voir d'où tu tires toutes ces âneries

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 73
    Points : 69
    Points
    69
    Par défaut
    Citation Envoyé par Loulou24
    Fais une recherche sur D3DDECLUSAGE_POSITIONT ou D3DFVF_XYZRHW par exemple.
    Je ne connaissais pas cette option

    Citation Envoyé par Loulou24
    Ben moi je voudrais bien voir d'où tu tires toutes ces âneries
    La coordonnée W d'un vertex est généralement dédié au poids de celui-ci, c'est tout...

  13. #13
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Je ne connaissais pas cette option
    Donc tu n'as jamais utilisé ce mode de rendu... Dans ce cas tu peux au moins nous croire sur parole (ou mieux : essayer par toi-même) avant de débattre pendant des heures.

    La coordonnée W d'un vertex est généralement dédié au poids de celui-ci, c'est tout...
    Le poids d'un sommet (lorsque l'on utilise l'animation squelettale) est effectivement défini par un flottant supplémentaire, mais ce n'est pas la coordonnée W. La coordonnée W (mise à 1 par défaut lorsque tu manipules une position XYZ), est obligatoire au moment de transformer les vertices -- il faut bien des vecteurs à 4 coordonnées pour passer dans des matrices 4x4. C'est notamment elle qui permet d'appliquer des translations à tes sommets (contenues dans la 4eme colonne de tes matrices donc) ; elle est également utilisée après transformation pour normaliser les coordonnées XYZ, avant d'appliquer les transformations relatives au viewport. Et ce quelque soit le code que tu as écrit.

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 73
    Points : 69
    Points
    69
    Par défaut
    Merci du renseignement...

Discussions similaires

  1. Réponses: 3
    Dernier message: 19/02/2007, 23h35
  2. [vb.net]Pb ToolTip qui s'affiche pas
    Par charaf dans le forum Windows Forms
    Réponses: 6
    Dernier message: 30/11/2006, 22h20
  3. [VB.NET]Contrôle qui ne s'affiche pas
    Par Bleuarff dans le forum Windows Forms
    Réponses: 4
    Dernier message: 23/08/2006, 20h07
  4. [VB.NET] Pas moyen dafficher un integer
    Par guillaume1998 dans le forum VB.NET
    Réponses: 11
    Dernier message: 11/11/2005, 16h17
  5. [JFrame] Pas moyen d'avoir une fenetre active
    Par deedji dans le forum Agents de placement/Fenêtres
    Réponses: 3
    Dernier message: 24/05/2004, 16h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo