Strumenti necessari:

IDE Microsoft Visual Studio 2005 prelevabile gratuitamente da qua' scaricando l'installer che provvedera'  al download occorre registrarsi.


http://www.microsoft.com/italy/msdn/prodotti/vs2005/editions/download/visualcsharp.mspx

SDK DirectX necessario per il supporto alla programmazione DirectX

http://msdn2.microsoft.com/it-it/xna/aa937788.aspx

Ricordatevi che sono un bel po' di MB da scaricare quindi sarà certamente necessaria una linea ADSL

Dunque do per scontate le conoscenze basilari di C# e la consapevolezza nell'utilizzo di Visual Studio.

Una volta installato correttamente SDK e IDE, aprite quest'ultimo create un nuovo progetto Windows Applications  e aggiungete ai reference (pannello solutions exporer click con il dx del mouse Add Reference):

Microsoft.DirectX;
Microsoft.DirectX,Direct3D;
Microsodt.DirectX,Direct3DX; (versione piu' recente)

Ora aggiungete i namespace per una migliore comodita'

using Microsoft.DirectX;
using Microsoft.DirectX.Direct3D;

Bene la prima cosa da fare ' creare un metodo che inizializzi le DirectX e passi a esse tutte le direttive necessarie per il loro funzionamento, cio si ottiene creando un'oggetto PresentParameters quindi...

PresentParameters settaggio = new  
PresentParameters();

Ed un'oggetto chiamato Device che di fatto e' il canale di comunicazione tra il nostro codice e la nostra scheda video, per ora non istanziato.

Device device;

Ora creiamo il metodo :

public void SetDirectInit(IntPtr handle,int risoluzioneX,int risoluzioneY)
{
        settaggio.BackBufferCount = 1;
            settaggio.AutoDepthStencilFormat = DepthFormat.D16;
   settaggio.EnableAutoDepthStencil = true;
   settaggio.DeviceWindowHandle = handle;
   settaggio.Windowed = false;
   settaggio.SwapEffect = SwapEffect.Discard;
   settaggio.BackBufferWidth = risoluzioneX;
   settaggio.BackBufferHeight = risoluzioneY;
   settaggio.BackBufferFormat = Format.X8R8G8B8;
   settaggio.PresentationInterval = PresentInterval.Immediate;

     device = new Microsoft.DirectX.Direct3D.Device(0, Microsoft.DirectX.Direct3D.DeviceType.Hardware, handle, CreateFlags.HardwareVertexProcessing | CreateFlags.PureDevice, settaggio);

  //Buffer della profondita'
  device.RenderState.ZBufferEnable = false;
device.RenderState.ZBufferWriteEnable = true;

   device.RenderState.Lighting = true;
            device.RenderState.Ambient = System.Drawing.Color.White;
     device.RenderState.StencilEnable = true;
     device.RenderState.SpecularEnable = true;
     device.RenderState.UseWBuffer = true;
     device.RenderState.ShadeMode = ShadeMode.Phong;
     device.RenderState.CullMode = Cull.None;


}

Ecco questo metodo associa l'handle della nostra form all'oggetto device ed utilizza questo per creare una finestra tuttoschermo controllata da DirectX.

Ora pero' e' necessario creare un Timer che provveda al rendering continuo dentro a questa finestra, percui aggiungete un timer e create un evento Tick dalle proprieta':

   private void timer1_Tick(object sender, EventArgs e)
        {
        device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.Blue, 1, 0);
        device.BeginScene();

   //Qui vanno tutti i comandi DI rendering

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

Ok ora siamo pronti basta chimare il metodo passargli l'handle della form e azionare il Timer, nel listato completo che segue ho inserito un metodo che alla pressione del tasto Esc esce in maniera corretta da DIrectX:



using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Microsoft.DirectX;
using Microsoft.DirectX.Direct3D;

namespace WindowsApplicatio
{
    public partial class Form1 : Form
    {
       PresentParameters settaggio = new PresentParameters();
        Device device;

        public void SetDirectInit(IntPtr handle, int risoluzioneX, int risoluzioneY)
        {
            settaggio.BackBufferCount = 1;
            settaggio.AutoDepthStencilFormat = DepthFormat.D16;
            settaggio.EnableAutoDepthStencil = true;
            settaggio.DeviceWindowHandle = handle;
            settaggio.Windowed = false;
            settaggio.SwapEffect = SwapEffect.Discard;
            settaggio.BackBufferWidth = risoluzioneX;
            settaggio.BackBufferHeight = risoluzioneY;
            settaggio.BackBufferFormat = Format.X8R8G8B8;
            settaggio.PresentationInterval = PresentInterval.Immediate;

            device = new Microsoft.DirectX.Direct3D.Device(0, Microsoft.DirectX.Direct3D.DeviceType.Hardware, handle, CreateFlags.HardwareVertexProcessing | CreateFlags.PureDevice, settaggio);

            //Buffer della profondita'
            device.RenderState.ZBufferEnable = false;
            device.RenderState.ZBufferWriteEnable = true;

            device.RenderState.Lighting = true;
            device.RenderState.Ambient = System.Drawing.Color.White;
            device.RenderState.StencilEnable = true;
            device.RenderState.SpecularEnable = true;
            device.RenderState.UseWBuffer = true;
            device.RenderState.ShadeMode = ShadeMode.Phong;
            device.RenderState.CullMode = Cull.None;


        }


        public Form1()
        {
            InitializeComponent();
            this.SetDirectInit(this.Handle, 800, 600);
            timer1.Start();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
              device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.Blue, 1, 0);

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

        private void Form1_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar==(char)Keys.Escape)
            {
               device.Dispose();
                Form1.ActiveForm.Close();
            }
        }
    }
}


pulsar4@alice.it