Affichage d'une image jpg avec direct3d mobile 5.0

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 / Exemple :


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

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.