Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

AFFICHAGE D'UNE IMAGE JPG AVEC DIRECT3D MOBILE 5.0


Information sur la source

Description

Bonjour
J'ai cherche quelque temps pour trouver comment afficher une simple image a l'ecran avec Direct3D Mobile 5.0 sur mon telephone.
Je vous ai mis cette source que j'ai realisee a partir de plusieurs toturiaux dont je me suis servit et de l'aide que j'ai eu sur Codes-sources.
DirectX Mobile 5.0 ne contient pas DirectDraw, donc pour faire de la 2D, vous n'avez pas le choix il faut passer par Direct3D.

L'affichage d'une image se fait par le biais de la creation de deux triangles (positionnes et construits pour qu'ils forment un rectangle) qui seront textures avec l'image a afficher.

 

Source

  • using System;
  • using System.Collections.Generic;
  • using System.Windows.Forms;
  • using System.Drawing;
  • using Microsoft.WindowsMobile.DirectX;
  • using Microsoft.WindowsMobile.DirectX.Direct3D;
  • using System.Reflection;
  • namespace DarkDominion
  • {
  • class GraphicEngine : System.Windows.Forms.Form
  • {
  • /// <summary>
  • /// The main entry point for the application.
  • /// </summary>
  • [MTAThread]
  • static void Main()
  • {
  • GraphicEngine fenetre = new GraphicEngine();
  • fenetre.InitializeGraphics();
  • fenetre.Show();
  • while (fenetre.Created)
  • {
  • fenetre.Render();
  • Application.DoEvents();
  • }
  • fenetre.DisposeGraphics();
  • }
  • public Device device;
  • public bool Created;
  • public Texture texture;
  • public VertexBuffer vertices;
  • public VertexBuffer vertices2;
  • protected bool InitializeGraphics()
  • {
  • Created = true;
  • PresentParameters pres = new PresentParameters();
  • // Plein ecran, dans le cas ou vous ne voulez pas du plein ecran, retirer les affectations
  • // du BackBufferWidth et du BackBufferHeight qui seront correctement geres tout seuls
  • pres.Windowed = false;
  • pres.BackBufferWidth = this.Width;
  • //pres.BackBufferHeight = this.Height;
  • // En utilisant la ligne precedente qui semblerait normal, la taille ne sera pas exactement
  • // la bonne car il prendra encore en compte la barre du menu demarrer en haut
  • pres.BackBufferHeight = this.Width * 4 / 3; // avec cette affectation la taille est la bonne
  • pres.SwapEffect = SwapEffect.CopyVSync;
  • device = new Device(0, DeviceType.Default, this, CreateFlags.None, pres);
  • // Chargement de la texture
  • texture = CreateOverlayTexture(device);
  • // creation du premier triangle
  • vertices = CreateVertexBuffer(device);
  • // creation du second triangle
  • vertices2 = CreateVertexBuffer2(device);
  • return true;
  • }
  • protected VertexBuffer CreateVertexBuffer(Device device)
  • {
  • VertexBuffer buf = new VertexBuffer(typeof(CustomVertex.TransformedTextured), 3, device, 0, CustomVertex.TransformedTextured.Format, Pool.Managed);
  • PopulateVertexBuffer(buf);
  • return buf;
  • }
  • protected void PopulateVertexBuffer(VertexBuffer vertices)
  • {
  • // Notez qu'on utilise TransformedTextured
  • CustomVertex.TransformedTextured[] verts =(CustomVertex.TransformedTextured[])vertices.Lock(0, 0);
  • int i = 0;
  • verts[i++] = new CustomVertex.TransformedTextured(
  • 0, 0, 0.5F, // position du sommet
  • 1, // rhw (avancé)
  • 0, 1); // coordonnées texture
  • verts[i++] = new CustomVertex.TransformedTextured(
  • Width, Height, 0.5F,
  • 1,
  • 1, 0);
  • verts[i++] = new CustomVertex.TransformedTextured(
  • 0, Height, 0.5F,
  • 1,
  • 1, 1);
  • vertices.Unlock();
  • }
  • protected VertexBuffer CreateVertexBuffer2(Device device)
  • {
  • VertexBuffer buf = new VertexBuffer(typeof(CustomVertex.TransformedTextured), 3, device, 0, CustomVertex.TransformedTextured.Format, Pool.Managed);
  • PopulateVertexBuffer2(buf);
  • return buf;
  • }
  • protected void PopulateVertexBuffer2(VertexBuffer vertices)
  • {
  • CustomVertex.TransformedTextured[] verts = (CustomVertex.TransformedTextured[])vertices.Lock(0, 0);
  • int i = 0;
  • verts[i++] = new CustomVertex.TransformedTextured(
  • 0, 0, 0.5F, // position du sommet
  • 1, // rhw (avancé)
  • 0, 1); // coordonnées texture
  • verts[i++] = new CustomVertex.TransformedTextured(
  • Width, 0, 0.5F,
  • 1,
  • 0, 0);
  • verts[i++] = new CustomVertex.TransformedTextured(
  • Width, Height, 0.5F,
  • 1,
  • 1, 0);
  • vertices.Unlock();
  • }
  • protected Texture CreateOverlayTexture(Device device)
  • {
  • Texture t = TextureLoader.FromStream(device, Assembly.GetExecutingAssembly().GetManifestResourceStream("DarkDominion.Photos.HERVE_Production_Logo.jpg"));
  • return t;
  • }
  • protected void Render()
  • {
  • device.Clear(ClearFlags.Target, Color.Black, 1.0F, 0);
  • device.BeginScene();
  • // Nouvelle ligne
  • device.SetTexture(0, texture);
  • //device.VertexFormat = CustomVertex.TransformedTextured.Format;
  • device.SetStreamSource(0, vertices, 0);
  • device.DrawPrimitives(PrimitiveType.TriangleList, 0, 1);
  • device.SetStreamSource(0, vertices2, 0);
  • device.DrawPrimitives(PrimitiveType.TriangleList, 0, 1);
  • device.EndScene();
  • device.Present();
  • }
  • protected void DisposeGraphics()
  • {
  • device.Dispose();
  • }
  • }
  • }
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Drawing;
using Microsoft.WindowsMobile.DirectX;
using Microsoft.WindowsMobile.DirectX.Direct3D;
using System.Reflection;

namespace DarkDominion
{
    class GraphicEngine : System.Windows.Forms.Form
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [MTAThread]
        static void Main()
        {
            GraphicEngine fenetre = new GraphicEngine();
            fenetre.InitializeGraphics();
            fenetre.Show();
            while (fenetre.Created)
            {
                fenetre.Render();
                Application.DoEvents();
            }
            fenetre.DisposeGraphics();
        }


        public Device device;
        public bool Created;
        public Texture texture;
        public VertexBuffer vertices;
        public VertexBuffer vertices2;

        protected bool InitializeGraphics()
        {
            Created = true;
            PresentParameters pres = new PresentParameters();
			// Plein ecran, dans le cas ou vous ne voulez pas du plein ecran, retirer les affectations
			// du BackBufferWidth et du BackBufferHeight qui seront correctement geres tout seuls
            pres.Windowed = false;
            pres.BackBufferWidth = this.Width;
            //pres.BackBufferHeight = this.Height;
			// En utilisant la ligne precedente qui semblerait normal, la taille ne sera pas exactement
			// la bonne car il prendra encore en compte la barre du menu demarrer en haut
            pres.BackBufferHeight = this.Width * 4 / 3; // avec cette affectation la taille est la bonne
            pres.SwapEffect = SwapEffect.CopyVSync;
            device = new Device(0, DeviceType.Default, this, CreateFlags.None, pres);

			// Chargement de la texture
            texture = CreateOverlayTexture(device);
			// creation du premier triangle
            vertices = CreateVertexBuffer(device); 
			// creation du second triangle
            vertices2 = CreateVertexBuffer2(device);
            return true;
        }

        protected VertexBuffer CreateVertexBuffer(Device device)
        {
            VertexBuffer buf = new VertexBuffer(typeof(CustomVertex.TransformedTextured), 3, device, 0, CustomVertex.TransformedTextured.Format, Pool.Managed);
            PopulateVertexBuffer(buf);
            return buf;
        }


        protected void PopulateVertexBuffer(VertexBuffer vertices)
        {
            // Notez qu'on utilise TransformedTextured
            CustomVertex.TransformedTextured[] verts =(CustomVertex.TransformedTextured[])vertices.Lock(0, 0);
            int i = 0;
            verts[i++] = new CustomVertex.TransformedTextured(
              0, 0, 0.5F, // position du sommet
              1,                           // rhw (avancé)
              0, 1);                       // coordonnées texture
            verts[i++] = new CustomVertex.TransformedTextured(
              Width, Height, 0.5F,
              1,
              1, 0);
            verts[i++] = new CustomVertex.TransformedTextured(
              0, Height, 0.5F,
              1,
              1, 1);

            vertices.Unlock();
        }

        protected VertexBuffer CreateVertexBuffer2(Device device)
        {
            VertexBuffer buf = new VertexBuffer(typeof(CustomVertex.TransformedTextured), 3, device, 0, CustomVertex.TransformedTextured.Format, Pool.Managed);
            PopulateVertexBuffer2(buf);
            return buf;
        }


        protected void PopulateVertexBuffer2(VertexBuffer vertices)
        {
            CustomVertex.TransformedTextured[] verts = (CustomVertex.TransformedTextured[])vertices.Lock(0, 0);
            int i = 0;
            verts[i++] = new CustomVertex.TransformedTextured(
              0, 0, 0.5F, // position du sommet
              1,                           // rhw (avancé)
              0, 1);                       // coordonnées texture
            verts[i++] = new CustomVertex.TransformedTextured(
              Width, 0, 0.5F,
              1,
              0, 0);
            verts[i++] = new CustomVertex.TransformedTextured(
              Width, Height, 0.5F,
              1,
              1, 0);

            vertices.Unlock();
        }

        
        protected Texture CreateOverlayTexture(Device device)
        {
            Texture t = TextureLoader.FromStream(device, Assembly.GetExecutingAssembly().GetManifestResourceStream("DarkDominion.Photos.HERVE_Production_Logo.jpg"));
            return t;
        }


        protected void Render()
        {
            device.Clear(ClearFlags.Target, Color.Black, 1.0F, 0);
            device.BeginScene();


            // Nouvelle ligne
            device.SetTexture(0, texture);


            //device.VertexFormat = CustomVertex.TransformedTextured.Format;
            device.SetStreamSource(0, vertices, 0);
            device.DrawPrimitives(PrimitiveType.TriangleList, 0, 1);
            device.SetStreamSource(0, vertices2, 0);
            device.DrawPrimitives(PrimitiveType.TriangleList, 0, 1);


            device.EndScene();
            device.Present();
        }

        protected void DisposeGraphics()
        {
            device.Dispose();
        }
    }
}

Conclusion

Le code est encore assez redondant, mais je vais l'ameliorer pour le rendre plus generique et pratique a utiliser.
La source vous permettra de comprendre comment faire de la 2D avec Direct3D Mobile 5.0

 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Commentaires et avis

signaler à un administrateur
Commentaire de sebseb42 le 07/04/2006 16:00:10

tu peux utiliser un seul VertexBuffer dans lequel tu met tous les points, et ensuite tu fait un seul appel a SetStreamSource et DrawPrimitives :

device.SetStreamSource(0, vertices, 0);
device.DrawPrimitives(PrimitiveType.TriangleList, 0, 2);

2  pour dire que tu as 2 triangles dans ton VertexBuffer. Aussi, DirectDraw est deprecated, tout comme GAPI... il a été a plusieurs reprises démontrer qu'il était carrement plus rentable de tracer (meme de la 2D) en utilisant les fonctionnalitées 3D... et donc forcement, par ce biais, la question la plus legitime a se poser est : "dans ce cas pourquoi maintenir 3 lib differentes alors qu'une seul rempli le boulot des 2 autres et de maniere plus performante".

voila

signaler à un administrateur
Commentaire de gretata le 26/01/2007 11:16:04

Bonjour, dit moi tu le trouve ou le Microsoft.WindowsMobile.DirectX.Direct3D
Microsoft.WindowsMobile.DirectX;

??

car j'arrive pas a le trouver

merci

signaler à un administrateur
Commentaire de Diabolus le 26/01/2007 23:40:52

Salut
Une fois que tu as installé correctement le SDK et que tu as créé ton projet pour Windows Mobile 5 (pour Pocket PC ou Smartphone ou autre), dans le menu "Solution Explorer" (la liste de tes fichiers), déplies "References" et fais bouton droit sur "References", puis "Add References"et dans l'onglet ".NET" tu trouveras "Microsoft.WindowsMobile.DirectX". Tu fais OK et tu pourras ensuite faire fonctionner le "using Microsoft.WindowsMobile.DirectX.Direct3D" et "using Microsoft.WindowsMobile.DirectX"

J'espère que cela t'aura aidé
A++

signaler à un administrateur
Commentaire de gretata le 29/01/2007 13:22:07

Merci beaucoup d'avoir repondu aussi vite, je vois se qui faut faire, encore une fois merci et bonne journée

signaler à un administrateur
Commentaire de babou6a le 14/10/2008 21:39:05

Bonjour,
Je trouve très intéressant de trouver des morceaux de code dans ce genre pour apprendre.
Cependant j'ai un petit problème, car à l'exécution le texture loader retourne null ce qui fait un exception.
Pourtant j'ai bien changé le fichier et mis ma propre texture, je ne comprends pas.

Babou

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Conversion d'un BMP en JPG [ par projetbts ] Bonjour,Je cherche, par besoin de place, à convertir une image bmp en jpeg. Celle ci est, dans un premier temps, destiné a être placé en image (img sr Redimensionnement image [ par Diamondduff ] Mon but est de faire des vignettes(jpg) &#224; partir d'une image (toujours en jpg)Il existe la m&#233;thode GetThumbnailImage (classe image), le prob Image.FromFile et File.Delete/File.Move [ par JuS ] Bonjour,Voici mon problème. Je suis en train de développer une application qui va chercher des images pour les afficher. Jusque là tout va bien.J'affi Panoramique 2D / une promenade dans une image [ par Bobbbbbbbbbby ] Salut alors je cherche pour un projet trés précis a réaliser une sorte de promenade dans une image qui mesure 6000px x 1200px je sais pas du tout comm Afficher un JPG avec DirectX Mobile [ par Diabolus ] Bonjour a tousVoila je cherche a afficher une image JPG avec DirectX Mobile present sur le Windows Mobile 5.0.Il y a quelques nuences avec le DirectX Tag EXIF dans Jpg [ par olibara ] Bonjour Quelqu'un a-t-il déja joué avec les tags EXIF d'une image JPEG ?Particulierement en vue de sauver une image avec des tags heure, date etc ? [C#] Compression d'image [ par bibicool ] Bonjour &#224; tous, Dans mon projet, je dois faire des acquisitions d'image, tout fonctionne nickel, l'acquisition de mon image se passe bien et m Faire de la 2D avec Direct3D [ par vincentClimber ] Bonjour,je cherche un moyen&nbsp;pour faire une DLL C# en DX9 manag&#233; utilisant Direct3D qui me permette de faire des traitements simple 2D (Ellip Résolution d'image [ par DavDav02 ] Salut &#224; tous,Je suis en BTS et je dois r&#233;aliser un projet de capture + traitement d'image.Je rencontre un petit probl&#232;me et j'aurais be Ajouter dynamiquement des composants graphiques [ par Sebulba ] Bonjourj'ai un thread qui doit créer un élément graphique sur la form pour pouvoir se représenter.mon problème est que je n'arrive pas à afficher une


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,406 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.