Bonjour à tous.
Face à ma curiosité toujours à l’affût et à l'abandon plus ou moins programmé de XNA (non, je l'ai pas dit !), je m'intéresse à DirectX (11) via C# et SharpDX. C'est vraiment très bien et relativement simple à maîtriser quand on sait lire les exemples DirectX en C++...
Pour le moment, je découvre (ça me rappelle Managed DirectX 9 d'il y a... des années !). J'en suis à faire tournoyer des cubes avec gestion de la profondeur, et je voudrais juste afficher un petit texte dans un coin, histoire de voir ce que ça donne en FPS.
La seule chose qu'on trouve vraiment sur internet quand on s'intéresse au texte en DX11, c'est qu'il y avait en DX10 des classes étudiées pour et qu'elles n'existent plus en DX11, et donc bref qu'il faut de débrouiller avec Direct2D et DirectWrite et que c'est la galère, etc. Soit, débrouillons-nous !
En décortiquant l'exemple DirectWrite de la doc µSoft sur DX11, j'ai réussi à le C#-iser et à le SharpDX-iser pour afficher le célèbre bonjour à l'écran. Ca, ça fonctionne !
Par contre, dès que je rajoute l'affichage des cubes, je ne vois plus rien. En fait, c'est la ligne
qui affiche tout ce que les commandes device.ImmediateContext.DrawIndexed ont préparé qui met le boxon : elle présente à l'écran toute la 3D mais me vire le texte. L'effet est bizarre : le texte clignote, apparaissant environ 1/3 de seconde toutes les 5 à 10 secondes...
Code : Sélectionner tout - Visualiser dans une fenêtre à part swapChain.Present(0, PresentFlags.None);
Je cherche donc à rendre compatible l'affichage de texte et de 3D. J'ai dans l'idée que c'est tout simple. Peut-être juste un truc pour faire cohabiter le rendertarget 3D et le rendertarget 2D qui partangent la même fenêtre ? Auriez-vous une idée ?
Je mets ci-dessous la partie 2D "texte".
Merci
Le code dans la boucle de rendu :
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 //Factory DirectWrite var fdw = new SharpDX.DirectWrite.Factory(SharpDX.DirectWrite.FactoryType.Isolated); //Format de Texte var tf = new SharpDX.DirectWrite.TextFormat(fdw, "Arial", 28); tf.TextAlignment = SharpDX.DirectWrite.TextAlignment.Center; tf.ParagraphAlignment = SharpDX.DirectWrite.ParagraphAlignment.Center; //Créer les ressources d2d //- Factory Direct2D var fd2d = new SharpDX.Direct2D1.Factory(SharpDX.Direct2D1.FactoryType.SingleThreaded); //- RenderTarget /*var surface = Surface.FromSwapChain(swapChain, 0); //Vieux souvenir d'un essai précédent...*/ var renderTargetProperties = new SharpDX.Direct2D1.RenderTargetProperties() { DpiX = 0f, DpiY = 0f, Type = SharpDX.Direct2D1.RenderTargetType.Hardware, Usage = SharpDX.Direct2D1.RenderTargetUsage.None, MinLevel = SharpDX.Direct2D1.FeatureLevel.Level_DEFAULT, PixelFormat = new SharpDX.Direct2D1.PixelFormat() }; var hwndRenderTargetProperties = new SharpDX.Direct2D1.HwndRenderTargetProperties() { Hwnd = fenêtre.Handle, PixelSize = fenêtre.ClientSize, PresentOptions = SharpDX.Direct2D1.PresentOptions.None }; //Le RenderTarget var rt = new SharpDX.Direct2D1.WindowRenderTarget( fd2d, renderTargetProperties, hwndRenderTargetProperties); //Un pinceau var pn = new SharpDX.Direct2D1.SolidColorBrush(rt, new Color4(0f, 0f, 1f, 0.8f)); //Le texte var texte = "Bonjour les djeunz !";
Au-dessus de ce bout de code, j'ai la partie rendu 3D, et en-dessous j'ai la ligne swapChain.Present(0, PresentFlags.None);
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 //Dessiner le texte rt.BeginDraw(); rt.Transform = Matrix3x2.Identity; rt.Clear(new Color4(0f, 0f, 0f, 1f)); rt.DrawText(texte, tf, new RectangleF(10f, 10f, 200f, 200f), pn); rt.EndDraw();
Quel que soit l'ordre des lignes, ça ne donne rien.
Partager