3.1.1顶点缓存 索引缓存

放置在显存中能够加快绘制速度

创建顶点缓存

HRESULT CreateVertexBuffer(
UINT Length, //为缓存分配的字节数
DWORD Usage, //缓存附加属性,可为0
DWORD FVF, //顶点格式
D3DPOOL Pool, //缓存的内存池
IDirect3DVertexBuffer9** ppVertexBuffer, //返回的结构
HANDLE* pSharedHandle //不用 设置为0
);
创建索引缓存
HRESULT CreateIndexBuffer(
UINT Length,
DWORD Usage,
D3DFORMAT Format,
D3DPOOL Pool,
IDirect3DIndexBuffer9** ppIndexBuffer,
HANDLE* pSharedHandle
);
Usage != D3DUSAGE_DYNAMIC 放置在静态缓存中,适合处理运行中不需要修改的数据
Usage = D3DUSAGE_DYNAMIC 放置在动态缓存,适合频繁更新内容,如粒子系统,动态缓存放置在内存AGP区域,可以很快的被更新
3.1.2访问数据
HRESULT Lock( 
UINT OffsetToLock,   //缓存中的起始点
UINT SizeToLock,   //需要锁定的数目
VOID ** ppbData,     //返回的被锁定的缓存区起始位置
DWORD Flags //锁定方式:
);
BOOL Unlock();
3.1.3获得顶点缓存信息
typedef struct D3DVERTEXBUFFER_DESC {
D3DFORMAT Format;
D3DRESOURCETYPE Type;
DWORD Usage;
D3DPOOL Pool;
UINT Size;
DWORD FVF;
} D3DVERTEXBUFFER_DESC, *LPD3DVERTEXBUFFER_DESC;
typedef struct D3DINDEXBUFFER_DESC {
D3DFORMAT Format;
D3DRESOURCETYPE Type;
DWORD Usage;
D3DPOOL Pool;
UINT Size;
} D3DINDEXBUFFER_DESC, *LPD3DINDEXBUFFER_DESC;
IDirect3DIndexBuffer9::GetDesc();
3.2 绘制状态
HRESULT SetRenderState(
[in] D3DRENDERSTATETYPE State,
[in] DWORD Value
);
3.3绘制准备工作
(1)制定数据流输入源
HRESULT SetStreamSource(
UINT StreamNumber, //数据流 可以是多个
IDirect3DVertexBuffer9 * pStreamData,//建立数据流的缓存
UINT OffsetInBytes, //被传送到绘制流水线顶点数据的起始位置
UINT Stride //顶点缓存的大小
);
(2)设置顶点格式
HRESULT SetFVF(  DWORD FVF); 顶点格式如下:
(3)设置使用的索引,任意时刻只能有一个索引缓存,如果不同索引绘制物体时,必须进行切换
HRESULT SetIndices(
IDirect3DIndexBuffer9 * pIndexData
);
3.4 绘制方法
使用顶点绘制
HRESULT DrawPrimitive(  
D3DPRIMITIVETYPE PrimitiveType,  //绘制的图元类型,TRIANGLELIST 
UINT StartVertex,  //绘制起点索引
UINT PrimitiveCount //绘制的图元数量
);
采用索引绘制
HRESULT DrawIndexedPrimitive(
D3DPRIMITIVETYPE Type,
INT BaseVertexIndex, //物体顶点在全局缓存中的起始位置偏移
UINT MinIndex,
UINT NumVertices,
UINT StartIndex,
UINT PrimitiveCount
);
绘制在下列函数之间进行

IDirect3DDevice9::BeginScene()

IDirect3DDevice9::EndScene()

实例:看完代码之后 多的一层了解:

(1)世界变换矩阵,取景变换矩阵,投影变换矩阵设置后 在绘图中起作用

(2)缓存中其实就在准备数据

   1:   
   2:  #include "d3dUtility.h"
   3:   
   4:  IDirect3DDevice9* Device = 0; 
   5:   
   6:  const int Width  = 640;
   7:  const int Height = 480;
   8:   
   9:  IDirect3DVertexBuffer9* VB = 0;
  10:  IDirect3DIndexBuffer9*  IB = 0;
  11:   
  12:  //顶点格式定义
  13:  struct Vertex
  14:  {
  15:      Vertex(){}
  16:      Vertex(float x, float y, float z)
  17:      {
  18:          _x = x;  _y = y;  _z = z;
  19:      }
  20:      float _x, _y, _z;
  21:      static const DWORD FVF;
  22:  };
  23:  //全局定点格式
  24:  const DWORD Vertex::FVF = D3DFVF_XYZ;
  25:   
  26:  //
  27:  // Framework Functions
  28:  //
  29:  bool Setup()
  30:  {
  31:      // Create vertex and index buffers.
  32:      Device->CreateVertexBuffer(
  33:          8 * sizeof(Vertex), 
  34:          D3DUSAGE_WRITEONLY,
  35:          Vertex::FVF,
  36:          D3DPOOL_MANAGED,
  37:          &VB,
  38:          0);
  39:      Device->CreateIndexBuffer(
  40:          36 * sizeof(WORD),
  41:          D3DUSAGE_WRITEONLY,
  42:          D3DFMT_INDEX16,
  43:          D3DPOOL_MANAGED,
  44:          &IB,
  45:          0);
  46:   
  47:   
  48:      // 填充数据
  49:      Vertex* vertices;
  50:      VB->Lock(0, 0, (void**)&vertices, 0);
  51:   
  52:      // vertices of a unit cube
  53:      vertices[0] = Vertex(-1.0f, -1.0f, -1.0f);
  54:      vertices[1] = Vertex(-1.0f,  1.0f, -1.0f);
  55:      vertices[2] = Vertex( 1.0f,  1.0f, -1.0f);
  56:      vertices[3] = Vertex( 1.0f, -1.0f, -1.0f);
  57:      vertices[4] = Vertex(-1.0f, -1.0f,  1.0f);
  58:      vertices[5] = Vertex(-1.0f,  1.0f,  1.0f);
  59:      vertices[6] = Vertex( 1.0f,  1.0f,  1.0f);
  60:      vertices[7] = Vertex( 1.0f, -1.0f,  1.0f);
  61:   
  62:      VB->Unlock();
  63:   
  64:      // define the triangles of the cube:
  65:      WORD* indices = 0;
  66:      IB->Lock(0, 0, (void**)&indices, 0);
  67:   
  68:      // front side
  69:      indices[0]  = 0; indices[1]  = 1; indices[2]  = 2;
  70:      indices[3]  = 0; indices[4]  = 2; indices[5]  = 3;
  71:   
  72:      // back side
  73:      indices[6]  = 4; indices[7]  = 6; indices[8]  = 5;
  74:      indices[9]  = 4; indices[10] = 7; indices[11] = 6;
  75:   
  76:      // left side
  77:      indices[12] = 4; indices[13] = 5; indices[14] = 1;
  78:      indices[15] = 4; indices[16] = 1; indices[17] = 0;
  79:   
  80:      // right side
  81:      indices[18] = 3; indices[19] = 2; indices[20] = 6;
  82:      indices[21] = 3; indices[22] = 6; indices[23] = 7;
  83:   
  84:      // top
  85:      indices[24] = 1; indices[25] = 5; indices[26] = 6;
  86:      indices[27] = 1; indices[28] = 6; indices[29] = 2;
  87:   
  88:      // bottom
  89:      indices[30] = 4; indices[31] = 0; indices[32] = 3;
  90:      indices[33] = 4; indices[34] = 3; indices[35] = 7;
  91:   
  92:      IB->Unlock();
  93:   
  94:      D3DXVECTOR3 position(0.0f, 0.0f, -5.0f);
  95:      D3DXVECTOR3 target(0.0f, 0.0f, 0.0f);
  96:      D3DXVECTOR3 up(0.0f, 1.0f, 0.0f);
  97:      D3DXMATRIX V;
  98:   
  99:      D3DXMatrixLookAtLH(&V, &position, &target, &up);
 100:      //设置取景变换矩阵
 101:      Device->SetTransform(D3DTS_VIEW, &V);
 102:   
 103:      // Set the projection matrix.
 104:      D3DXMATRIX proj;
 105:      D3DXMatrixPerspectiveFovLH(
 106:              &proj,
 107:              D3DX_PI * 0.5f, // 90 - degree
 108:              (float)Width / (float)Height,
 109:              1.0f,
 110:              1000.0f);
 111:   
 112:      //设置投影变换矩阵
 113:      Device->SetTransform(D3DTS_PROJECTION, &proj);
 114:   
 115:      //设置绘图模式
 116:      Device->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME);
 117:   
 118:      return true;
 119:  }
 120:   
 121:  void Cleanup()
 122:  {
 123:      d3d::Release<IDirect3DVertexBuffer9*>(VB);
 124:      d3d::Release<IDirect3DIndexBuffer9*>(IB);
 125:  }
 126:   
 127:  bool Display(float timeDelta)
 128:  {
 129:      if( Device )
 130:      {
 131:          // spin the cube:
 132:          D3DXMATRIX Rx, Ry;
 133:   
 134:          // rotate 45 degrees on x-axis
 135:          D3DXMatrixRotationX(&Rx, 3.14f / 4.0f);
 136:   
 137:          // incremement y-rotation angle each frame
 138:          static float y = 0.0f;
 139:          D3DXMatrixRotationY(&Ry, y);
 140:          y += timeDelta;     // 每帧增加旋转量
 141:   
 142:          // reset angle to zero when angle reaches 2*PI
 143:          if( y >= 6.28f )
 144:              y = 0.0f;
 145:   
 146:          // combine x- and y-axis rotation transformations.
 147:          D3DXMATRIX p = Rx * Ry;
 148:   
 149:          //设置世界变换矩阵
 150:          Device->SetTransform(D3DTS_WORLD, &p);
 151:   
 152:          //
 153:          // draw the scene:
 154:   
 155:          //清除背景
 156:          Device->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0xffffffff, 1.0f, 0);
 157:          Device->BeginScene();
 158:   
 159:          //设置数据源
 160:          Device->SetStreamSource(0, VB, 0, sizeof(Vertex));
 161:   
 162:          //设置使用的索引
 163:          Device->SetIndices(IB);
 164:   
 165:          //
 166:          Device->SetFVF(Vertex::FVF);
 167:   
 168:          // Draw cube.
 169:          Device->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 8, 0, 12);
 170:   
 171:          Device->EndScene();
 172:          Device->Present(0, 0, 0, 0);
 173:      }
 174:      return true;
 175:  }
 176:   
 177:   
 178:  //
 179:  // WndProc
 180:  //
 181:  LRESULT CALLBACK d3d::WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
 182:  {
 183:      switch( msg )
 184:      {
 185:      case WM_DESTROY:
 186:          ::PostQuitMessage(0);
 187:          break;
 188:          
 189:      case WM_KEYDOWN:
 190:          if( wParam == VK_ESCAPE )
 191:              ::DestroyWindow(hwnd);
 192:          break;
 193:      }
 194:      return ::DefWindowProc(hwnd, msg, wParam, lParam);
 195:  }
 196:   
 197:  //
 198:  // WinMain
 199:  //
 200:  int WINAPI WinMain(HINSTANCE hinstance,
 201:                     HINSTANCE prevInstance, 
 202:                     PSTR cmdLine,
 203:                     int showCmd)
 204:  {
 205:      if(!d3d::InitD3D(hinstance,
 206:          Width, Height, true, D3DDEVTYPE_HAL, &Device))
 207:      {
 208:          ::MessageBox(0, "InitD3D() - FAILED", 0, 0);
 209:          return 0;
 210:      }
 211:          
 212:      if(!Setup())
 213:      {
 214:          ::MessageBox(0, "Setup() - FAILED", 0, 0);
 215:          return 0;
 216:      }
 217:   
 218:      d3d::EnterMsgLoop( Display );
 219:   
 220:      Cleanup();
 221:   
 222:      Device->Release();
 223:   
 224:      return 0;
 225:  }

Direct基础学习系列3 绘制+实例的更多相关文章

  1. Linux基础学习系列目录导航

    Linux基础学习-通过VM安装RHEL7.4 Linux基础学习-命令行与图形界面切换 Linux基础学习-基本命令 Linux基础学习-RHEL7.4之YUM更换CentOS源 Linux基础学习 ...

  2. Bootstrap基础学习 ---- 系列文章

    [Bootstrap基础学习]05 Bootstrap学习总结 [Bootstrap基础学习]04 Bootstrap的HTML和CSS编码规范 [Bootstrap基础学习]03 Bootstrap ...

  3. DirectX 基础学习系列6 字体

    DIRECTX9自带ID3DXFONT类 内部调用GDI的接口,效率一般,但能够处理一些复杂的字体 HRESULT D3DXCreateFontIndirect( LPDIRECT3DDEVICE9 ...

  4. 【MongoDB安装和基础学习系列】

    转:http://www.cnblogs.com/lipan/archive/2011/03/08/1977691.html 系列目录 MongoDB学习笔记(一) MongoDB介绍及安装     ...

  5. Python零基础学习系列之二--Python介绍及环境搭建

    1-1.Python简介: Python是一种解释型.面向对象.动态数据类型的高级程序设计语言.Python由Guido van Rossum于1989年底发明,第一个公开发行版发行于1991年.像P ...

  6. Python零基础学习系列之三--Python编辑器选择

    上一篇文章记录了怎么安装Python环境,同时也成功的在电脑上安装好了Python环境,可以正式开始自己的编程之旅了.但是现在又有头疼的事情,该用什么来写Python程序呢,该用什么来执行Python ...

  7. javascript基础学习系列-DOM盒子模型常用属性

    最近在学习DOM盒子模型,各种属性看着眼花缭乱,下面根据三个系列来分别介绍一下: client系列 clientWidth :width+(padding-left)+(padding-right)— ...

  8. Python零基础学习系列之四--Python程序设计思想

    前面我们把Python环境安装成功,同时也选择了自己合适的IDE工具来开启自己的编程之旅. 那么今天来说说怎么编程,程序设计需要什么步骤,我们应该怎么做才能编写自己的程序. 1-1.程序设计方法: I ...

  9. JavaScript零基础学习系列四

    案例分享 对象 具体的东西,在以js的眼光看所有的标签都是标签对象,对象是属性的无序集合. 创建对象有两种方式: 直接量: 构造器:所谓的构造器,其实就是函数,只不过这个函数有些特殊,因为它是用于创建 ...

随机推荐

  1. loj 1025(记忆化搜索)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=25902 #include<iostream> #inc ...

  2. enter键实现自动登录

    将登录窗口的属性acceptbutton更改为登录按钮!

  3. Effective C++ 学习笔记[2]

    2. 第一节 习惯C++ 2.1 C++是一个语言联邦,包括以下四个部分: C:包括区块.语句.预处理器.内置数据类型.数组.指针等,但是C语言本身存在局限:没有模板template.没有异常exce ...

  4. sql2005 将一列的多行内容拼接成一行

    select ID, Name = ( stuff ( ( select ',' + Name from Table_1 where ID = a.ID for xml path('') ),1,1, ...

  5. HDU2196 Computer(树形DP)

    和LightOJ1257一样,之前我用了树分治写了.其实原来这题是道经典的树形DP,感觉这个DP不简单.. dp[0][u]表示以u为根的子树中的结点与u的最远距离 dp[1][u]表示以u为根的子树 ...

  6. PO3281 Dining(最大流)

    如果只有食物或者饮料那就是个二分图最大匹配. 三个真想不出来..然后看题解..从源点到食物到牛到饮料到汇点,这样建图. 所以思维不能太局限了,不懂得把食物和饮料放到牛两边,以为牛吃食物饮料.食物饮料被 ...

  7. Unity3D Built-in Shader详解一

    Unity3D内置了很多Shader,文档很详细,自己翻一下.便于加深印象. 首先先解释下Unity3D的Shader.Unity里面的Shaders是使用一种叫ShaderLab的语言编写的,它同微 ...

  8. C#线程间同步无法关闭

    用C#做了个线程间同步的小程序,但每次关闭窗口后进程仍然在,是什么原因? 解决方法: 要加一句 线程.IsBackground = true; 否则退出的只是窗体 上面的方法没看懂... MSDN上说 ...

  9. Robotium查找指定控件

    一.通过ID查找控件 Activity act=solo.getCurrentActivity(): int id=act.getResources().getIdentifier("id名 ...

  10. Mono for Android 篇二 使用Spinner 实现下拉列表读取Browser.BookmarksUri

    http://www.cnblogs.com/ivanyb/archive/2013/03/05/2944818.html 1.首先在VS2010里面创建一个Android Application 简 ...