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