d3d基本框架

 

一、D3D简述

        由微软公司开发的DirectX,并不是一个单纯的图形API,它包含有Direct Graphics(Direct 3D+Direct Draw)、Direct Input、Direct Play、Direct Sound、Direct Show、Direct Setup、Direct Media Objects等多个组件,它提供了一整套的多媒体接口方案。

        D3D即Direct3D是DirectX的三维部分,集成了开发DirectX程序三维图形部分的所有API程序,同时它支持与CUDA的互操作,这样经CUDA并行计算后图像数据可以直接供D3D做显示,这非常适合图形图像系统的研发。

 

二、D3D程序基本结构

          一个D3D程序除去Windows窗口生成和消息传递,主要包含3个步骤:

       初始化D3D设备资源--->图形显示设置---->D3D资源设备释放。

 

1、初始化D3D设备资源

     建一个D3D接口:

      LPDIRECT3D9   g_pD3D = NULL;

      g_pD3D                               =Direct3DCreate9(D3D_SDK_VERSION);

   LPDIRECT3D9的对象是D3D程序的最顶层对象,其它对象都必须通过它的接口函数调用得到。

   Direct3DCreate9(D3D_SDK_VERSION)函数就是创建一个当前版本的一个D3D对象并返回接口。

 

     创建D3D设备对象:

    

D3DPRESENT_PARAMETERS d3dpp;                                    //显示参数

d3dpp.BackBufferWidth = 800;                                                    //显示像素x

d3dpp.BackBufferHeight = 600;                                                   //显示像素y

d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8;                 //32位像素格式

d3dpp.BackBufferCount = 1;                                                        //备缓冲表面的数量,通常设为“1

d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE;         //全屏抗锯齿的类型

d3dpp.MultiSampleQuality = 0;                                                     //全屏抗锯齿的质量等级

d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;            //指定表面在交换链中是如何被交换的

d3dpp.hDeviceWindow = hwnd;

d3dpp.Windowed = false;                                                               //true表示窗口显示,false为全屏显示

d3dpp.EnableAutoDepthStencil = true;                                        //设为trueD3D将自动创建深度/模版缓冲                         

d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8;              // 深度/模版缓冲的格式

d3dpp.Flags = 0;                                                                            //附加特性,可以设为D3DPRESENTFLAG_DISCARD_DEPTHSTENCIL

//深度/模版缓冲在调用IDirect3DDevice9::present方法后将被删除,这有利于提程序性能提升

 

d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;   //刷新率,设定D3DPRESENT_RATE_DEFAULT使用默认 刷新率

d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;    //PresentationInterval——属于D3DPRESENT成员,又有两个 常用标志,其余请查SDK

   D3DPRESENT_INTERVAL_IMMEDIATE——立即交换

  D3DPRESENT_INTERVAL_DEFAULT——D3D选择交换速度,通常等于刷新率

 

IDirect3DDevice9* device = 0;                                                   //d3d设备

hr = g_pD3D->CreateDevice(

     D3DADAPTER_DEFAULT,                                                 // 指定对象要表示的物理显示设备

     D3DDEVTYPE_HAL,                                                            // 定设备类型 硬件设备D3DDEVTYPE_HAL,     

                                                                                                                                软件设备D3DDEVTYPE_REF

     hwnd,                                                                                        // window associated with device

     D3DCREATE_HARDWARE_VERTEXPROCESSING,  // 顶点处理类型,硬件处理方式。软件处理方式为

                                                                                                         D3DCREATE_SOFTWARE_VERTEXPROCESSING

     &d3dpp,                                                                                   // 显示参数

     &device);                                                                                

   if( FAILED(hr) )

   {

     ::MessageBox(0, "CreateDevice() - FAILED", 0, 0);

     return 0;

   }

 

 2、图形显示

HRESULT IDirect3DDevice9::Clear()函数的作用是在绘制函数前,重置viewport的缓冲区,这是在绘制3D图形前必须调用的

BeginScene()和EndScene()分别为开始和结束渲染,两者必须成对出现,并且不允许嵌套和交错。注意图形渲染的结果是存储在后台缓冲区的。

HRESULT IDirect3DDevice9:: Present()函数是将图形渲染的结果由后台缓冲区复制到前台缓冲区予以显示。

 

               device->Clear(0, 0,

                     D3DCLEAR_TARGET ,

                     D3DCOLOR_XRGB(125,0,255), 1.0f,0);

              device->BeginScene();

                   // ........ //添加纹理渲染,图元绘制等函数

              device->EndScene();

              //将渲染的结果存储到后台缓冲区

              //0表示更新所有的缓冲区

              device->Present(0, 0, 0, 0);

 

3、D3D设备资源释放

       释放D3D设备资源的方法如下:

       if( device )    device->Release();

       if(g_pD3D)  g_pD3D->Release();

     

Release()函数会将调用这个设备的DirectX对象的引用计数减1,当DirectX对象的引用计数为0时,它就会释放它所占有的资源。

 

 

 

 

 

  

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值