Volkan Atasever

mühendislik, edebiyat, retro computer, yazılım, şiir, nümismatik, bilişim, podcast ve daha bir çok yazılarım...

Windows Mobile ile Direct3D Programlama

clock Ekim 5, 2009 19:45 by author Volkan Atasever

Bu yazımı CSharpnedir.Com sitesinden de okuyabilirsiniz.   

Link: http://csharpnedir.com/articles/read/?id=991&filter=unedited&title=Windows%20Mobile%20ile%20Direct3D%20Programlama

 

Bu yazımda sizlere mobil dünyanın standart 2d boyutundan 3. Boyuta geçmenin yöntemlerinden yani Direct3D’den bahsedip küçük bir uygulamayla bir direct3d penceresini çalıştıracağız. Bu uygulamamızda ki amaç mobil cihaz üstünde nasıl Direct3D programlama yapabileceğimizi incelemek. Küçük bir demo ile de pekiştireceğimiz bu dünya, geleceğin en temel teknolojisini yani windows mobile cihazlarımızda 3 boyutlu bir dünyaya merhaba dememizi sağlamaktadır. Klasik görünümünden sıyrılıp tam bir bilgisayar olduğunu anlamımıza yarayacak. Şu aşamada XNA’in desteklediği platformlar üstünde windows mobile olmadığı için bu cihazlarda direct3d kullanmaktayız.

 Öncelikle temel olarak hangi referanslara ihtiyacımız olduğunu burada belirtmek isterim;

using Microsoft.WindowsMobile.DirectX;
using Microsoft.WindowsMobile.DirectX.Direct3D;
using System.Runtime.InteropServices;
using System.Drawing;
using System.Windows.Forms;

Klasik referanslarımız olan DirectX argümanlarına WindowsMobile isim uzayı altından ulaşmaktayız. Bunun için DirectX’in ve SDK’larının bilgisayarınızda kurulu olması gerekmektedir. Using cümleciğiyle ihtiyacımız olan namespaceleri tanımlamış bulunmaktayız. Ardından Direct3D aygıtı için değişken tanımlamamız gereklidir.        

Bunun içinde;

Device device = null;

şeklinde aygıtımızı tanımladık. Artık 3 boyutlu dünyaya mobil cihazımızda merhaba demiş bulunuyoruz. Bunun için ilk aygıtımızın (Device) ayarlamalarıyla mobil cihaza uygun hale getirmek için gerekli kod parametrelerini vermek istiyorum. Bu sayede programlamaya hazır bir Direct3D penceresi karşımıza gelecektir. Kullanmamız gereken diğer namespace’ler;

using System;
using System.Drawing;
using System.Windows.Forms;

ardından ana sınıfımız ve kurucu metodumuz;

// Uygulamanın ana sınıfı
public class DeviceYarat : Form
{

      // Uygulamamızın global değişkeni bundan sonra aygıt diye anacağız
     Device device = null;

     public DeviceYarat()
     {
           // başlığı düzenle
           this.Text = "D3D dünyasına hoşgeldin";
           this.MinimizeBox = false;
     }
}

         Penceremizin üstünde D3D dünyasına hoşgeldin yazacaktır. Bu uygulama Direct3D programlamanın iskeletini içermektedir. Aşağıdaki metottaki presentparameters sınıfı aygıt oluşturulurken gerekli olan bazı parametreleri içinde bulundurmaktadır. InitializeGraphics metodunda ise; presentParams.Windowed = true ile uygulamanın bir pencereye sahip olacağını söylemektedir.

       public bool InitializeGraphics()
       {
            try
           {
                    PresentParameters presentParams = new PresentParameters();
                    
presentParams.Windowed = true;
                    presentParams.SwapEffect = SwapEffect.Discard;


                   device = new Device(0, DeviceType.Default, this,
                   CreateFlags.None, presentParams);
            }
           catch (DirectXException)
           {  
                   return false; 
           }
            return true;
       }

           Aygıt dediğimiz device sınıfı ise burada canlanacak ve aldığı parametrelerin anlamları ise şöyledir; İlk 0 olan parametre System.Int32 türünden bir değer oluğ D3D uygulamadaki adaptörlerin sıra numarasıdır, varsayılan parametre ise 0’dır.

İkinci parametre olan devicetype ise aşağıdaki değerlerden birini alabilmektedir;

DeviceType.Hardware
DeviceType.Reference
DeviceType.Software

           Biz burada default olanını seçtik. Diğer parametre ise görüntüyü gösterebileceğimiz pencere olarak o anki çalışan pencereyi seçmek için this anahtar kelimesini kullandık. CreateFlags ise uygulamada kullanılacak olan özellikler kümesini kendinde barındırmaktadır. Yine belli bir değer seçmemize rağmen brada seçebileceğimiz bayrakları belirtelim;      

CreateFlags.AdapterroupDevice
CreateFlags.DisableDriverMAnagement
CreateFlags.MixedVertexProcessing
CreateFlags.HardwareVertexProcessing
CreateFlags.SoftwareVertexProcessing
CreateFlags.PureDevice
CreateFlags.Mutithreaded

Örnek olarak CreateFlags.HardwareVertexProcessing; tüm bağlantı noktalarının donanımda işleyeceğini söylemektedir. Son parametre ise PresentParameters sınıfından türettiğimiz ve yukarıda anlattığım özellikleri aygıta kazandırır.


private void Render()
{
    if (device != null) 
    {
        device.Clear(ClearFlags.Target, System.Drawing.Color.Blue,
        1.0f, 0);
        device.BeginScene();

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

           Aygıtımızı ayarladıktan sonra sıra render işlemlerine geldi. Render metodumuzda öncelikle render işlermelerine başamadan aygıtımızı ve önbelleğimizi(buffer) temizliyoruz bunun içinde Clear metodunu kullanırken bazı parametreler vermekteyiz. Bunlar; ClearFlags.Target yani belirli bir hedefe göre temizlerken ikinci parametre ise temizledikten sonra mobil cihazımızın ekranının alacağı renktir. Üçüncü parametre derinlik tamponunun değeridir. 1.0f ile herşeyi sıfırlamış oluyoruz. Ardından render işlemine başlamak için BeginScene metodunu kullanıyoruz bu sayede aygıtın çizime hazır olduğunu belirtmekteyiz. Her BeginScene yaptığımızda EndScene’de kullanmalıyız çünkü endscene yapmadan bir daha beginscene metodunu çağıramayız. Fakat bu çağrılar ekranımızı güncellememizi sağlamaz bunun için ekranı güncellemek için ise present metodunu kullanmaktayız.


Diğer olaylarımıza bakmak istersek;

protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
{
        this.Render();

        this.Invalidate(); 
}

protected override void OnPaintBackground(
System.Windows.Forms.PaintEventArgs e)
{
}


Bu sayede çıkış tuşuna basıldığında programdan çıkılacaktır.

protected override void OnKeyPress(
System.Windows.Forms.KeyPressEventArgs e)
{
        if ((int)(byte)e.KeyChar == (int)System.Windows.Forms.Keys.Escape)
        this.Close();
}


Main metodumuz;

static void Main() 
{
        DeviceYarat frm = new DeviceYarat();

        if (!frm.InitializeGraphics())
        {
                MessageBox.Show("Direct3D başlatılamadı. " + 
                "programdan çıkıldı.");
                return;
        }

        Application.Run(frm);
}

           Gördüğünüz gibi Main metodumuzda ana sınıfımızdan bir nesne yaratarak küçük bir if deyimi ile yazdığımız InitializeGraphics() metodumuzun geri dönüş değerini kontrol edip uygulamamızı çalıştırıyoruz.


Çıktımız; 
 



VB.NET ile Ses İşlemleri

clock Kasım 17, 2006 07:55 by author Volkan Atasever

  VB.NET’in biz programcılar için yapabilecekleri gerçekten neredeyse sınırsıza yakın. .NET ortamını, Visual Basic’in kolaylığıyla ve .NET’in kompleks içeriğiyle birleştirdiğimiz zaman inanılmaz özelliklere imza atan bir ortam görüyoruz.
        Programlarımızı zenginleştirmek için görsel öğeleri bolca kullanmaktayız. Ses unsuru da unutulmaması gereken başlıca özelliklerden. Ses bildiğimiz gibi kulağımıza gelen ve beynimizin uyarılmasını sağlayan dış unsurlarla duyumsamamızı etkileyen bir titreşim topluluğudur.
        Biz ise sıradan ses den değil ses sinyallerinden bahsedeceğiz İngilizce terimi ile ifade edersek: “audio”.
        Fazla derinlemesine girmeden standart ve standart dışı olarak VB.NET projelerimizde bu sesi nasıl kullanabileceğimizi örneklendireceğiz. Gerek Directx Sound gerekse apilerle veya directx audioplayback ile bunları nasıl elde edeceğimizi inceleyeceğiz.
        Bir oyun yazıyorsanız sizin için çok yararlı olacaktır veya kullanıcı ile etkileşime giren bir program.
        Başlangıç olarak makalemin teknik kısmına directx sound ile başlamak istiyorum. Başlamadan önce directx sdk nın bilgisayarınıza yüklü olduğuna emin olmalısınız ben şubat 2006 dağıtımını kullandım.

        http://www.microsoft.com/windows/directx/default.mspx
        Yukarıdaki bağlantının download kısmında sdk yı indirebilirsiniz.
        Projenize ileriki adımlarda da kullanmak için bazı referanslar eklemek zorundayız. Aşağıdaki resimde görebilirsiniz. 

Projemize sağ tıklayıp add reference kısmına basıyoruz.
        Ardından; 

Microsoft.DirectX.DirectSound , Microsoft.DirectX.AudioVideoPlayBack ve Microsoft.DirectX referanslarını projenize ekleyin.
        Not: Burada projenin bütün kodlarını değil de can alıcı noktalarını açıklayacağım. Uygulamanın tam kodlarını örnek kodlar bölümünden indirebilirsiniz.

        Imports Microsoft.DirectX.DirectSound
        Imports Microsoft.DirectX
        ile namespacelerimizi projemize dahil ediyoruz.
        İlk başta bize gereken bilgisayarımızdaki herhangi bir yoldan ses dosyamızı çağırmaktır. Bunun için bir textbox ve bir browse butonuna ihtiyacımız var. Textbox bileşenimizde de ses dosyamızın yolunu görebileceğiz bunun için gerekli olan toolbox’ımızdan OpenFileDİalog isimli bileşinimizi projememize eklememizdir. 

OpenFileDialog1.ShowDialog()
         filename = OpenFileDialog1.FileName
         TextBox1.Text = filename

        Filename ise bir string olarak tanımlanmıştır.
        Temel kodumuz ise aşağıdaki gibidir:


                  Dim dev As New Device()
                  dev.SetCooperativeLevel(Me, CooperativeLevel.Normal)
                  Dim dsc As New BufferDescription()
                  dsc.ControlVolume = True
                  dsc.ControlFrequency = True
                  Dim snd As New SecondaryBuffer(filenamedxsound, dev)
                  snd.Volume = volume
                  snd.Frequency = frekans
                  snd.Play(0, BufferPlayFlags.Default)

          Device nesnemizi ses kartınız olarak düşenebilirsiniz sesimizi çalmamız için gereken en temel bileşendir. Yani ilk önce ses aygıtımızı oluşturduk. Ardından aygıtımızın üzerinden setcooperativelevel’i çağırmamız gerekir. Burada Normal’i kullandık çoğunluklada bu seçenek yeterli olacaktır. Ayrıca bir BufferDescription nesnesini canlandırdık bunun sebebi bu nesne üzerinde dahil olan ses yüksekliğini ve ses frekansının değerlerini aktif hale getirmek için kullanılmıştır. Ardından SecondaryBuffer’ımızı oluşturup filenamdxsound adını verdiğimiz dosya ismimizi çağırıyor ve ikinci parametre olarakda aygıtımızız gösteriyoruz. Snd.Volume e ses yüksekliği değerimizi Frequency’e ise bizim seçtiğimiz frekansı aktarıp . snd.Play’e 0 değerini veriyoruz ve varsayılan değer olarak çalmasını yani bir kere çalıp durmasını söylüyoruz.
          Örnek uygulamamızda kullandığımız gibi bir trackbar kullanmak isterseniz maximum ve minimum değerlerini doğru seçmeniz gerekecektir. Bunun içinde volume trackbar’ımızın maximumunu 0 ve minimumunu ise -3000 olarak ayarlamalısınız.
          Frekans’ımızın minimumumu ise 100 maksimumuda 10000’dir.
          Sesi ve frekansı trackbarla ayarlamamıza yarayacak örnek kodumuz:
           If TrackBar1.Value = TrackBar1.Minimum Then
                      volume = -3000
           Else
                     volume = TrackBar1.Value
           End If
           If TrackBar2.Value = TrackBar2.Minimum Then
                      frekans = 100
           Else
                      frekans = TrackBar2.Value
           End If
          Directx sound ile ses çaldırırken daha bir çok özellik yer almaktadır. Bunlardan bazıları,
          Sağ ve sol balansı kontrol etmek için gereken özellik:
          Yukarıdaki kodumuzda aşağıdaki modifikasyonları yapabilirsiniz.
                     Dim dev As New Device()
                      dev.SetCooperativeLevel(Me, CooperativeLevel.Normal)
                     Dim dsc As New BufferDescription()
                     dsc.ControlVolume = True
                      dsc.ControlPan = True
                     Dim snd As New SecondaryBuffer(filenamedxsound, dev)
                     snd.Volume = volume
                      snd.Pan = 3000
                     snd.Play(0, BufferPlayFlags.Default)

          Speaker seçiminide kolay bir şekilde projenize ekelmeniz olası:
          ‘ Yeni Speaker Nesnesi yarat
          Dim spk As New Speakers();

          ‘ Properties’ler
          spk.Mono = false ‘ mono speaker
          spk.Headphone = false ‘ headphones
          spk.Stereo = false ‘ stereo speakers
          spk.Quad = true ‘ quad system (iki ön, iki arka)
          spk.FiveDotOne = false ‘ 5.1 surround system
          spk.SevenDotOne = false ‘ 7.1 surround system
          spk.Surround = false ‘ surround system
          dev.SpeakerConfig = spk;

          Directx.AudioVideoPlayback ile ses çaldırmak ise Directxsound’dan daha kolay ve birkaç kod satırı ile sesi çaldırabiliyoruz.
          Bunun içinde
          Imports Microsoft.DirectX.AudioVideoPlayback
          Namespace’imizi import etmemiz gerekecek.
          Kodumuz ise:
                     Dim audio As New Audio(filenameaudiopb)
                     audio.Volume = volume
                     audio.Play()

                    Burada filenameaudiopb ses dosyamızın ismi ve Audio nesnemizde ses dosyasını çalmamızı yarayan nesnemiz. audio.Volume ve audio.Play() ile default olarak sesimizi çaldırabiliriz.
          Ses dosyalarını çaldırmak için diğer bir yöntemimiz ise DLL import ile API’ler kullanılarak eskiden kalma yöntemlerle oluşturacağımız bir sistemdir.
                    Imports System.Runtime.InteropServices
          Projemize yukarıdaki namespace’i ekleyelim.
          Ardından;
                      Declare Auto Function PlaySound Lib "winmm.dll" (ByVal name _
                     As String, ByVal hmod As Integer, ByVal flags As Integer) As Integer
                      Public Const SND_SYNC = &H0 ' Senkron
                      Public Const SND_ASYNC = &H1 ' Asenkron
                     Public Const SND_FILENAME = &H20000

          ile DLL dosyamızı import edelim ve sabitlerimizi belirleyelim SND_SYNC müzik dosyamızı Senkron bir şekilde çalmamızı SND_ASYNC ise asenkron şekilde çalmamızı gerçekleyecektir. SND_FILENAME ise adından anlayacağınız gibi dosyamızın ismi.
          Tanımlamalarımız biraz karmaşık olmasına rağmen çalma işlemimiz çok daha basittir. Bunun için yapacağınız tek şey PlaySound metodunu kullanmanız olacaktır.
          PlaySound(filename,0,SND_FILENAME)
          Senkron veya asenkron çaldırmak için ise
          PlaySound(filename,0,SND_FILENAME or SND_SYNC)
          Veya
          PlaySound(filename,0,SND_FILENAME or SND_ASYNC)
          Şeklinde kodumuza ekleme yapabiliriz.
          Diğer sabitlerimiz ise aşağıdaki gibidir:
                     Public Const SND_SYNC = &H0
                     Public Const SND_ASYNC = &H1
                     Public Const SND_MEMORY = &H4
                     Public Const SND_ALIAS = &H10000
                     Public Const SND_NODEFAULT = &H2
                     Public Const SND_FILENAME = &H20000
                     Public Const SND_RESOURCE = &H40004
           Not: Directx Sound ve API’lerle wav dosyalarını çalıp üstünde işlem yapabilirken Directx audio playback ile mp3 dosyalarını da çaldırabilirsiniz.



Volkan Atasever Kimdir ?

E-Mail: volkan(et)volkanatasever.com

Kurucu&Genel Müdür/S4G
Bilgisayar Mühendisi
Eğitmen ve Danışman
Teknoloji Yazarı

mühendislik, edebiyat, retro computer, yazılım, şiir, nümismatik, bilişim, podcast ve bir çok kategoride yazılarım...

     

Yazılım Kitaplarım

   

Şiir Kitaplarım

Ulusal Yayınlar ve Programlar

 

Sosyal Ağlarım

 

 

 

 

Retro Bilgisayar Dergimiz

Türkçe Retro Bilgisayar dergimiz haziran 2016'da ilk sayısını çıkardı.  Sizde katkıda bulunmak isterseniz bana mail atmanız yeterli. Dergimiz PDF formatında ve tamamen ücretsizdir. Software4Galaxy imtiyaz sahibidir. S4G sitesinden veya facebook sayfasından dergilere ulaşabilirsiniz.

Üye Olduğum Dernek ve Organizasyonlar

 

Yasal Bilgi

Sitedeki yazıları,kodlar ve diğer materyaller Volkan Atasever'e aittir. Yazarı ve siteyi kaynak göstererek yazıları paylaşabilirsiniz.  Copyright(c)2004-2019

Sign In

Yazılım