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


     今天心血来潮,看了一下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, this, CreateFlags.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() 中间没有做任何事情,所以就没有什么被渲染,这个例子可以被当作模板使用。

  • 相关阅读:
    jquery滑动效果的运动模块封装
    jquery幻灯片淡入淡出组件封装
    vue目录结构熟悉
    npm安装Vue.js
    jQuery瀑布流插件masonry
    mysql 使用 limit ,从指定条数读取完,-1失效
    jquery二级导航
    带输入提示的搜索框ajax请求
    封装好通用的reset.css base.css 样式重置css文件
    mysql 同时支持多少连接MYSQL 查看最大连接数和修改最大连接数
  • 原文地址:https://www.cnblogs.com/xdotnet/p/directx_3d_start.html
Copyright © 2020-2023  润新知