且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

[XNA Game远征]DirectX 3D初次见面

更新时间:2022-09-13 08:07:16

 今天心血来潮,看了一下DirectX的编程,对于根本没有过DirectX知识的我肯定是去找Tutorial了,微软自带的,现在我们就看看第一个Tutorial1

  要使用它当然第一步要为他弄一个设备让他有地方住下,虽然我们国家不是很富裕当然住的地方还是有的,Device就是提供他们住的地方。这个类中有4个重载:

public Device(IDirect3DDevice9* pUnk);

public Device(IntPtr unmanagedObject);

public Device(int adapter, DeviceType deviceType, Control renderWindow, CreateFlags behaviorFlags, params PresentParameters[] presentationParameters);

public Device(int adapter, DeviceType deviceType, IntPtr renderWindowHandle, CreateFlags behaviorFlags, params PresentParameters[] presentationParameters);

  有些怪怪的哦,根本不知道他们是干什么用的,下面来看看关于他的一些传说J:

从上面我们可以看到有一个叫adapter的家伙一直顶在前头,他表示我们将要使用哪个物理图形卡,一般用0

DeviceType不用多说也知道是要创建那种类型的Device

    public enum DeviceType

    {

        Hardware = 1,

        Reference = 2,

        Software = 3,

        NullReference = 4,

}

  renderWindowHandle就是要把这个设备捆绑到哪个窗口上;

  behaviorFlags在设备创建之后的行为,是Flags枚举:

    [Flags]

    public enum CreateFlags

    {

        FpuPreserve = 2,

        MultiThreaded = 4,

        PureDevice = 16,

        SoftwareVertexProcessing = 32,

        HardwareVertexProcessing = 64,

        MixedVertexProcessing = 128,

        DisableDriverManagement = 256,

        AdapterGroupDevice = 512,

        DisableDriverManagementEx = 1024,

        NoWindowChanges = 2048,

}

  presentationParameters设备把数据呈现到显示器的方式,有N多个参数:

  其中有一个属性public bool Windowed,如果将其设为true则表示窗口模式。

(注:由于本人也是一知半解中,多有些参数也还是不知道她的用处,先留着她,等以后用到时再来)

  回到我们的例子中,我们可以看到首先声明了一个全局变量Device devic=null;然后就创建这个设备,在下面的代码我们可以看到设备的创建其实也不难:

public bool InitializeGraphics()

{

    try

    {

    // Now let's setup our D3D stuff

    PresentParameters presentParams = new PresentParameters();

    presentParams.Windowed=true;

    presentParams.SwapEffect = SwapEffect.Discard;

    device = new Device(0, DeviceType.Hardware, thisCreateFlags.SoftwareVertexProcessing, presentParams);

    return true;

    }

    catch (DirectXException)

    {

       return false;

    }

}

  上面还有一个没说的就是presentParams.SwapEffect = SwapEffect.Discard;这个是虾米易素呢?根据情报了解到SwapEffect成员是用于控制缓存交换的行为,如果选择了SwapEffect.Flip,运行时会创建额外的后备缓冲。

  private void Render()

       {

           if (device == null)

              return;

 

           //Clear the backbuffer to a blue color

           device.Clear(ClearFlags.Target, System.Drawing.Color.Blue, 1.0f, 0);

           //Begin the scene

           device.BeginScene();

          

           // Rendering of scene objects can happen here

   

           //End the scene

           device.EndScene();

           device.Present();

       }

  这个函数才是关键所在阿,Render(ASP.NET中应该每个页面都有这个栋栋,来呈现HTML元素。)是渲染的入口点,每一帧渲染都要调用这个函数。BeginScene()/EndScene()函数对,分别在渲染前后调用。BeginScene()会使系统检查内部数据结构和渲染表面的可用性有效性。这里在BeginScene()/EndScene() 中间没有做任何事情,所以就没有什么被渲染,这个例子可以被当作模板使用。


本文转自网魂小兵博客园博客,原文链接:http://www.cnblogs.com/xdotnet/archive/2007/01/17/directx_3d_start.html,如需转载请自行联系原作者