[DirectX] Appliquer transparence avec Direct3D Managed

Le côté programmation du développement d'un jeu vidéo.

Appliquer transparence avec Direct3D Managed

Messagepar CPPTryer » 28 Avr 2006, 21:06

Salut tout le monde^^
Bon ba dans l'attente d'acheter un livre sur DirectX Managed qui devrais sortir le 31Mai, je tente vite fait de faire un tit truc en vain. J'y vais un peu à taton en essayant des trucs, mais là je bloque sur comment appliquer de la transparence à un quad texturé formé de PositionColoredTextured vertex. C'est à dire que la couleur agit pas comme j'aurai pensé qu'elle agirait ^^ Que je change ou non la couleur alpha des vertex ça ne change rien et quand je mets tout à 0 ici mon arbre devient noir alors que moi j'aimerai ne plus le voir:00000017: bref la solution doit surement ètre évidente, mais au vue de mes pauvres connaissances:00000021: ^^ Sinon je voulais savoir si vous pensez que ça vaut le coups que j'étudie les shaders pour un début en 2d avec MDX car ça à l'air facile de rendre transparent un objet avec les pixels shaders par exemple. Voici le code :

Code: Tout sélectionner
using System;
using System.Windows.Forms;
using System.Drawing;
using Microsoft.DirectX;
using Microsoft.DirectX.Direct3D;
using System.Threading;

namespace Hmm
{
    public class AForm : Form
    {
        Device device = null;
        VertexBuffer vertexBuffer = null;

        Texture GrassTexture;
        Texture Arbre;
        Sprite Go;

        static void Main()
        {
            AForm form = new AForm();
            form.Size = new Size(800, 600);
            form.InitializeGraphics();
            form.Show();

            while (form.Created)
            {
                form.Render();
                Application.DoEvents();
            }
        }

        public void InitializeGraphics()
        {
            try
            {
                PresentParameters presentParams = new PresentParameters();
                presentParams.Windowed = true;
                presentParams.SwapEffect = SwapEffect.Discard;
                device = new Device(0,
                DeviceType.Hardware,
                this,
                CreateFlags.HardwareVertexProcessing,
                presentParams);
                LoadTextures();
                device.DeviceReset += new System.EventHandler(this.OnResetDevice);
                OnResetDevice(device, null);

                Go = new Sprite(device);
            }
            catch (DirectXException e)
            {
                MessageBox.Show(null,
                "Error intializing graphics: "
                + e.Message, "Error");
                Close();
            }
        }

        private void Render()
        {
            if (device == null) //if there's nothing to render with
                return;//then don't bother

            //Set the backbuffer to a nice blue
            device.Clear(ClearFlags.Target,
            System.Drawing.Color.Blue,
            1.0f, 0);

            device.BeginScene();

            Go.Begin(SpriteFlags.AlphaBlend);
            Go.Draw2D(GrassTexture, new PointF(0.0f, 0.0f), 0f, new PointF(0, 0), Color.White);
            Go.End();

            device.RenderState.DiffuseMaterialSource = ColorSource.Color1;

            device.RenderState.SourceBlend = Blend.SourceAlpha;
            device.RenderState.DestinationBlend = Blend.InvSourceAlpha;
            device.RenderState.AlphaBlendEnable = true;

            device.SetStreamSource(0, vertexBuffer, 0);
            device.VertexFormat = CustomVertex.PositionColoredTextured.Format;

            device.SetTexture(0, Arbre);
            device.Transform.World = Matrix.RotationZ(0f) * Matrix.Translation(0, 0, 0) * Matrix.Scaling(12, 12, 0);

            device.DrawPrimitives(PrimitiveType.TriangleFan, 0, 2);

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

        public void OnResetDevice(object sender, EventArgs e)
        {
            Device device = (Device)sender;

            vertexBuffer =
            new VertexBuffer(typeof(CustomVertex.PositionColoredTextured),
            4,
            device,
            0,
            CustomVertex.PositionColoredTextured.Format,
            Pool.Default);

            Matrix Ortho2D;
            Matrix Identity;

            Ortho2D = Matrix.OrthoOffCenterLH(0.0f, this.Width, 0, this.Height, -2.0f, 2.0f);
            device.SetTransform(TransformType.Projection, Ortho2D);

            Identity = Matrix.Identity;
            device.SetTransform(TransformType.World, Identity);
            device.SetTransform(TransformType.View, Identity);

            device.SetRenderState(RenderStates.ZBufferWriteEnable, false);
            device.SetRenderState(RenderStates.ZBufferFunction, true);
            this.device.RenderState.ZBufferEnable = false;
            device.RenderState.Lighting = false;
            device.RenderState.CullMode = Cull.CounterClockwise;

            vertexBuffer.Created +=
            new System.EventHandler(this.OnCreateVertexBuffer);
            this.OnCreateVertexBuffer(vertexBuffer, null);
        }

        public void LoadTextures()
        {
            try
            {

                System.Drawing.Bitmap grass = (System.Drawing.Bitmap)
                System.Drawing.Bitmap.FromFile(@"C:\Grass.bmp");
                GrassTexture = Texture.FromBitmap(device, grass, 0, Pool.Managed);
                Arbre = TextureLoader.FromFile(device, "Arbre.png");
            }
            catch
            {
                MessageBox.Show(this, "An error has occured while trying to load textures");
            }
        }


        public void OnCreateVertexBuffer(object sender, EventArgs e)
        {
            VertexBuffer buffer = (VertexBuffer)sender;

            CustomVertex.PositionColoredTextured[] verts = new CustomVertex.PositionColoredTextured[4];

            verts[2].Tu = 0.0f;
            verts[2].Tv = 0.0f;

            verts[3].Tu = 0.0f;
            verts[3].Tv = 1.0f;

            verts[0].Tu = 1.0f;
            verts[0].Tv = 1.0f;

            verts[1].Tu = 1.0f;
            verts[1].Tv = 0.0f;

            verts[0].Position = new Vector3(0, 0, 1.0f);
            verts[1].Position = new Vector3(0, 32, 1.0f);
            verts[2].Position = new Vector3(32, 32, 1.0f);
            verts[3].Position = new Vector3(32, 0, 1.0f);

            Color _Color = Color.FromArgb(255, 255, 255, 255);
            int IColor = _Color.ToArgb();

            verts[0].Color = IColor;
            verts[1].Color = IColor;
            verts[2].Color = IColor;
            verts[3].Color = IColor;

            buffer.SetData(verts, 0, LockFlags.None);

        }
    }
}

Au fait jvoulais savoir si jamais j'arrive un jour à faire fonctionner ce code, si dans une application j'ai envie de rendre progressivement un quad transparent, c'est pas couteux en perf de delocker le vertex buffer pour changer la couleur des vertex ?

Merci d'avance à tous le monde qui lira ce post:00000013:
CPPTryer
Hello World, I'm new !
 
Messages: 23
Inscription: 28 Juil 2005, 16:00

Messagepar Lenolian » 29 Avr 2006, 10:51

Sinon je voulais savoir si vous pensez que ça vaut le coups que j'étudie les shaders pour un début en 2d avec MDX car ça à l'air facile de rendre transparent un objet avec les pixels shaders par exemple.


Dans un avenir proche ( ~1an ) tout se fera avec des shader, plus de fixed function. Donc oui, c'est une bonne idée de se pencher sur les shaders dès maintenant.

Edit : Pour ce qui du problème de transparence, je vois pas trop. Mais bon il est encore tôt, peut-être plus tard ;p
J'ai toujours raison, même quand j'ai tort car alors j'ai raison d'avoir tort.
Avatar de l’utilisateur
Lenolian
Hello World, I'm new !
 
Messages: 799
Inscription: 10 Avr 2005, 16:17
Localisation: Toulouse

Messagepar Percewyn » 29 Avr 2006, 21:45

Pour ce qui est de ton problème de transparence, dans mon cas je règle le problème comme ceci.

myGraphicDevice.RenderState.AlphaTestEnable = true;
myGraphicDevice.RenderState.AlphaFunction = Compare.NotEqual;

J'ajoute ces deux lignes de codes afin d'afficher ce que je veux qui soit pris en compte avec la transparence.
Percewyn
Avatar de l’utilisateur
Percewyn
Hello World, I'm new !
 
Messages: 31
Inscription: 08 Mar 2006, 01:33


Retourner vers Programmation

Qui est en ligne

Utilisateurs parcourant ce forum: Yahoo [Bot] et 32 invités

cron