索引缓存

一个索引缓存是一块连续的存储了索引数据的内存

 

Length 分配给缓存的字节大小。假如想得到一个能存储3个顶点的顶点缓存,那么我们就要在顶点结构中设置这个参数为3 * sizeof ( Vertex ) 

Usage 指定关于怎样使用缓存的额外信息,可以为0,也可为一下几个参数的一个或多个组合:

D3DUSAGE_DYNAMIC——设置这个参数可以使缓存是动态的。在下一页说明静态和动态缓存。

D3DUSAGE_POINTS——这个参数指定缓存存储原始点。原始点将在第14章粒子系统中介绍。这个参数仅仅用在顶点缓冲中。

D3DUSAGE_SOFTWAREPROCESSING——使用软件顶点处理

D3DUSAGE_WRITEONLY——指定应用程序只能写缓存。它允许驱动程序分配最适合的内存地址作为写缓存。注意如果从创建好的这种缓存中读数据,将会返回错误信息。

FVF 存储在缓存中的顶点格式

Pool 缓存放置在哪一个内存池中

ppIndexBuffer 返回创建好的索引缓存的指针。

pShareHandle  目前没有使用,一般传NULL。

访问索引缓存

为了访问索引缓存,我们需要得到一个指针,因此我们需要使用IDirect3DIndexBuffer9::LockIDirect3DIndexBuffer9:: Unlock

 

OffsetToLock 偏移量,以字节为单位,从缓存开始位置到锁定开始位置的距离。

SizeToLock 锁定的字节数。

Flags 标记描述怎样锁定内存。它可能是或者是下面参数中的个或多个的组合

D3DLOCK_DISCARD——这个参数仅仅会在动态缓存时被使用。它指示硬件丢弃缓存并返回一个指向新分配的缓存的指针。这是很有用,因为当我们存取一个新分配的缓存时它允许硬件继续从丢弃的缓存渲染。这防止了硬件延迟。

D3DLOCK_NOO VERWRITE——这个参数仅仅会在动态缓存时被使用。它声明你将向缓存中添加数据。即,你不能向已经渲染的内存中写数据。这是有好处的因为他允许你在添加新数据到缓存的同时让硬件继续渲染。

D3DLOCK_READONLY——这个参数声明你锁定的缓存只能从中读取数据而不能写数据。这允许一些内在的优化。

视图变换

把实体从世界空间转换到视角空间,这个坐标变换被称为视变换(View Transformation)。

 

pOut 指向返回的视图矩阵

pEye 照相机在世界坐标系的位置

pAt  照相机在世界坐标系的目标点

pUp  世界坐标系的上方向

绘制图元(使用索引信息)

 

    Type 我们绘制的图元类型。比如,我们能绘制点和线以及三角形。以后我们使用三角形用D3DPT_TRIANGLELIST参数。

    BaseVertexIndex 一个基本数字,在调用中用它去加上索引。参看下面的说明。

    MinIndex 将被引用的最小索引值。

    NumVertices 在此调用中将被引用的顶点数。

    StartIndex 索引到索引缓存中的某个位置,它标记开始渲染的开始索引点。

    PrimitiveCount 绘制图元的个数。

 

 
   
  1. #include <d3dx9.h> 
  2. #include <string.h> 
  3. #include <Windows.h> 
  4.  
  5.  
  6. #define WINDOWNAME TEXT("D3DGameFrame") 
  7. #define WINDOWCLASS TEXT("The GameFrame of Dull") 
  8.   
  9.  
  10.  
  11. #define KEYDOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0) 
  12. #define KEYUP(vk_code)   ((GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1) 
  13.  
  14. const int Width  = 640; 
  15. const int Height = 480; 
  16.  
  17. HWND      mainWindowHandle = NULL;  
  18. HINSTANCE hinstanceApp     = NULL;  
  19. bool      ESC              = true
  20.  
  21. IDirect3DDevice9* Device = NULL;  
  22. IDirect3D9* d3d9 = NULL; 
  23. HRESULT hr = NULL; 
  24.  
  25. IDirect3DVertexBuffer9* VB = NULL; 
  26. IDirect3DIndexBuffer9*  IB = NULL; 
  27.  
  28. struct Vertex 
  29.     float x,y,z; 
  30. }; 
  31.  
  32. #define D3DFVF (D3DFVF_XYZ) 
  33.  
  34. LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) 
  35.     PAINTSTRUCT     ps;  
  36.     HDC             hdc;     
  37.  
  38.     switch( msg ) 
  39.     { 
  40.         case WM_PAINT:  
  41.             { 
  42.                 hdc = BeginPaint(hWnd,&ps);   
  43.  
  44.                 EndPaint(hWnd,&ps); 
  45.             }  
  46.             break
  47.         case WM_DESTROY: 
  48.             { 
  49.                 ::PostQuitMessage(0); 
  50.             }            
  51.             break;       
  52.     } 
  53.     return ::DefWindowProc(hWnd, msg, wParam, lParam); 
  54.  
  55.  
  56.  
  57. int GameInit(void *parms = NULL, int num_parms = 0) 
  58.     ESC = false
  59.  
  60.     Device->CreateVertexBuffer(8*sizeof(Vertex),D3DUSAGE_WRITEONLY,D3DFVF,D3DPOOL_MANAGED,&VB,NULL); 
  61.     Device->CreateIndexBuffer(36*sizeof(WORD),D3DUSAGE_WRITEONLY,D3DFMT_INDEX16,D3DPOOL_MANAGED,&IB,NULL); 
  62.  
  63.     Vertex Vertices[8] =  
  64.     { 
  65.         {-1.0f, -1.0f, -1.0f}, 
  66.         {-1.0f,  1.0f, -1.0f}, 
  67.         { 1.0f,  1.0f, -1.0f}, 
  68.         { 1.0f, -1.0f, -1.0f}, 
  69.         {-1.0f, -1.0f,  1.0f}, 
  70.         {-1.0f,  1.0f,  1.0f}, 
  71.         { 1.0f,  1.0f,  1.0f}, 
  72.         { 1.0f, -1.0f,  1.0f} 
  73.     }; 
  74.  
  75.     void* pVertices;  
  76.     VB->Lock(0,0,(void**)&pVertices,NULL); 
  77.      
  78.     memcpy(pVertices,Vertices,sizeof(Vertices)); 
  79.  
  80.     VB->Unlock(); 
  81.  
  82.     WORD* pIndices = NULL; 
  83.     IB->Lock(0,0,(void**)&pIndices,NULL); 
  84.  
  85.     // 前面 
  86.     pIndices[0]  = 0; pIndices[1]  = 1; pIndices[2]  = 2; 
  87.     pIndices[3]  = 0; pIndices[4]  = 2; pIndices[5]  = 3; 
  88.     //后面 
  89.     pIndices[6]  = 4; pIndices[7]  = 6; pIndices[8]  = 5; 
  90.     pIndices[9]  = 4; pIndices[10] = 7; pIndices[11] = 6; 
  91.     //左面 
  92.     pIndices[12] = 4; pIndices[13] = 5; pIndices[14] = 1; 
  93.     pIndices[15] = 4; pIndices[16] = 1; pIndices[17] = 0; 
  94.     //右面 
  95.     pIndices[18] = 3; pIndices[19] = 2; pIndices[20] = 6; 
  96.     pIndices[21] = 3; pIndices[22] = 6; pIndices[23] = 7; 
  97.     //上面 
  98.     pIndices[24] = 1; pIndices[25] = 5; pIndices[26] = 6; 
  99.     pIndices[27] = 1; pIndices[28] = 6; pIndices[29] = 2; 
  100.     //下面 
  101.     pIndices[30] = 4; pIndices[31] = 0; pIndices[32] = 3; 
  102.     pIndices[33] = 4; pIndices[34] = 3; pIndices[35] = 7; 
  103.  
  104.     IB->Unlock(); 
  105.  
  106.     //TODO:视图变换 
  107.     D3DXMATRIX out; 
  108.     D3DXVECTOR3 eye(0.0f,0.0f,-5.0f); 
  109.     D3DXVECTOR3 at(0.0f,0.0f,0.0f); 
  110.     D3DXVECTOR3 up(0.0f,1.0f,0.0f); 
  111.  
  112.     D3DXMatrixLookAtLH(&out,&eye,&at,&up); 
  113.     Device->SetTransform(D3DTS_VIEW, &out); 
  114.  
  115.     //TODO:投影变换 
  116.     D3DXMATRIX proj; 
  117.     D3DXMatrixPerspectiveFovLH(&proj,D3DX_PI*0.5f,(float)Width/(float)Height,1.0f,1000.0f); 
  118.     Device->SetTransform(D3DTS_PROJECTION,&proj); 
  119.      
  120.     //TODO:设置渲染状态 
  121.     Device->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME); 
  122.  
  123.     return 1; 
  124. }  
  125.  
  126.  
  127. int GameMain(void *parms = NULL, int num_parms = 0) 
  128.     if(ESC) return 0; 
  129.      
  130. //==========此处目前不必关心,只知道是旋转图形即可==============      
  131.     D3DXMATRIX Rx, Ry;                           
  132.     D3DXMatrixRotationX(&Rx, 3.14f / 4.0f);      
  133.     static float y = 0.0f; 
  134.     D3DXMatrixRotationY(&Ry, y); 
  135.     y += 0.0001f; 
  136.     if( y >= 6.28f ) 
  137.         y = 0.0f; 
  138.     D3DXMATRIX p = Rx * Ry; 
  139.     Device->SetTransform(D3DTS_WORLD, &p); 
  140. //=========================================================
  141.  
  142.     Device->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0xffffffff, 1.0f , 0); 
  143.     //TODO:绘制图形 
  144.     Device->BeginScene(); 
  145.  
  146.     Device->SetStreamSource( 0 , VB , 0 , sizeof(Vertex) ); 
  147.     Device->SetIndices(IB); 
  148.     Device->SetFVF(D3DFVF); 
  149.     Device->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 8, 0, 12); 
  150.  
  151.     Device->EndScene(); 
  152.  
  153.     Device->Present(NULL,NULL,NULL,NULL); 
  154.  
  155.     if (KEYDOWN(VK_ESCAPE)) 
  156.     { 
  157.         ESC = true
  158.         SendMessage(mainWindowHandle,WM_CLOSE,0,0); 
  159.     } 
  160.          
  161.     return 1; 
  162.  
  163. }  
  164.  
  165.  
  166. int GameShutdown(void *parms = NULL, int num_parms = 0) 
  167.  
  168.     if( NULL != IB) 
  169.     { 
  170.         IB->Release(); 
  171.         IB = NULL; 
  172.     } 
  173.  
  174.     if( NULL != VB) 
  175.     { 
  176.         VB->Release(); 
  177.         VB = NULL; 
  178.     } 
  179.     if( NULL != d3d9) 
  180.     { 
  181.         d3d9->Release(); 
  182.         d3d9 = NULL; 
  183.     } 
  184.  
  185.  
  186.     if( NULL != Device) 
  187.     { 
  188.         Device->Release(); 
  189.         Device = NULL; 
  190.     } 
  191.     return 1; 
  192. }    
  193.  
  194.  
  195.  
  196.  
  197. int WINAPI WinMain(HINSTANCE hInstance, 
  198.                    HINSTANCE prevInstance,  
  199.                    PSTR cmdLine, 
  200.                    int showCmd) 
  201.     HWND hWnd; 
  202.     MSG msg; 
  203.     WNDCLASS wndClass; 
  204.  
  205.     wndClass.style         = CS_HREDRAW | CS_VREDRAW; 
  206.     wndClass.lpfnWndProc   = (WNDPROC)WndProc;  
  207.     wndClass.cbClsExtra    = NULL; 
  208.     wndClass.cbWndExtra    = NULL; 
  209.     wndClass.hInstance     = hInstance; 
  210.     wndClass.hIcon         = LoadIcon(0, IDI_APPLICATION); 
  211.     wndClass.hCursor       = LoadCursor(0, IDC_ARROW); 
  212.     wndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); 
  213.     wndClass.lpszMenuName  = NULL; 
  214.     wndClass.lpszClassName = WINDOWCLASS; 
  215.  
  216.     if( !RegisterClass(&wndClass) )  
  217.     { 
  218.         ::MessageBox(NULL, TEXT("RegisterClass() - FAILED"), NULL, NULL); 
  219.         return false
  220.     } 
  221.  
  222.     hWnd = CreateWindow(WINDOWCLASS, 
  223.                         WINDOWNAME,  
  224.                         WS_OVERLAPPEDWINDOW | WS_VISIBLE, 
  225.                         0, 0,  
  226.                         Width,  
  227.                         Height, 
  228.                         NULL, 
  229.                         NULL, 
  230.                         hInstance, 
  231.                         NULL);  
  232.  
  233.     if( !hWnd ) 
  234.     { 
  235.         ::MessageBox(NULL,TEXT( "CreateWindow() - FAILED"), NULL, NULL); 
  236.         return false
  237.     } 
  238.  
  239.  
  240.     hinstanceApp = hInstance; 
  241.     mainWindowHandle = hWnd; 
  242.  
  243.     ::ShowWindow(hWnd, SW_SHOW); 
  244.     ::UpdateWindow(hWnd); 
  245.  
  246.     //1: 获得一个IDirect3D9接口指针。 
  247.  
  248.      
  249.     d3d9 = Direct3DCreate9(D3D_SDK_VERSION); 
  250.     /*Direct3DCreate9 的唯一一个参数总是D3D_SDK_VERSION, 
  251.     这可以保证应用程序通过正确的头文件被生成。如果函数调用失败, 
  252.     那么它将返回一个空指针。*/ 
  253.  
  254.     if( !d3d9 ) 
  255.     { 
  256.         ::MessageBox(NULL, TEXT("Direct3DCreate9() - FAILED"), NULL, NULL); 
  257.         return false
  258.     } 
  259.  
  260.     //2:检查设备能力(D3DCAPS9),搞清楚主显卡是否支持硬件顶点处理。. 
  261.     //当我们创建一个IDirect3DDevice9对象来表示主显示设备时,必须要设定其顶点处理的类型。 
  262.      
  263.     D3DCAPS9 caps; 
  264.  
  265.     d3d9->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &caps);// 填充主显示设备的能力(D3DCAPS9结构) 
  266.  
  267.     int vp = 0; 
  268.     if( caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT ) 
  269.         vp = D3DCREATE_HARDWARE_VERTEXPROCESSING; 
  270.     else 
  271.         vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING; 
  272.  
  273.     //3: 初始化一个D3DPRESENT _PARAMETERS结构实例。 
  274.   
  275.     D3DPRESENT_PARAMETERS d3dpp; 
  276.     d3dpp.BackBufferWidth            = Width; 
  277.     d3dpp.BackBufferHeight           = Height; 
  278.     d3dpp.BackBufferFormat           = D3DFMT_A8R8G8B8; 
  279.     d3dpp.BackBufferCount            = 1; 
  280.     d3dpp.MultiSampleType            = D3DMULTISAMPLE_NONE; 
  281.     d3dpp.MultiSampleQuality         = 0; 
  282.     d3dpp.SwapEffect                 = D3DSWAPEFFECT_DISCARD;  
  283.     d3dpp.hDeviceWindow              = hWnd; 
  284.     d3dpp.Windowed                   = true;  
  285.     d3dpp.EnableAutoDepthStencil     = true;  
  286.     d3dpp.AutoDepthStencilFormat     = D3DFMT_D24S8; 
  287.     d3dpp.Flags                      = 0; 
  288.     d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT; 
  289.     d3dpp.PresentationInterval       = D3DPRESENT_INTERVAL_IMMEDIATE; 
  290.  
  291.     //4:创建一个基于已经初始化好的D3DPRESENT _PARAMETERS结构的IDirect3DDevice9对象。 
  292.      
  293.     hr = d3d9->CreateDevice(//Creates a device to represent the display adapter. 
  294.         D3DADAPTER_DEFAULT, // primary adapter 
  295.         D3DDEVTYPE_HAL,     // device type 
  296.         hWnd,               // window associated with device 
  297.         vp,                 // vertex processing 
  298.         &d3dpp,             // present parameters 
  299.         &Device);           // return created device 
  300.  
  301.     if( FAILED(hr) ) 
  302.     { 
  303.         d3dpp.AutoDepthStencilFormat = D3DFMT_D16; 
  304.          
  305.         hr = d3d9->CreateDevice( 
  306.             D3DADAPTER_DEFAULT, 
  307.             D3DDEVTYPE_HAL, 
  308.             hWnd, 
  309.             vp, 
  310.             &d3dpp, 
  311.             &Device); 
  312.  
  313.         if( FAILED(hr) ) 
  314.         { 
  315.             d3d9->Release(); //释放d3d9 
  316.             ::MessageBox(NULL, TEXT("CreateDevice() - FAILED"), NULL, NULL); 
  317.             return false
  318.         } 
  319.     } 
  320.  
  321.     GameInit(); 
  322.  
  323.     while(TRUE) 
  324.     { 
  325.      
  326.         if(PeekMessage(&msg,NULL,0,0,PM_REMOVE)) 
  327.         {  
  328.             if (msg.message == WM_QUIT) 
  329.                 break;   
  330.             TranslateMessage(&msg); 
  331.             DispatchMessage(&msg); 
  332.         } 
  333.  
  334.         GameMain(); 
  335.          
  336.     }  
  337.  
  338.     GameShutdown(); 
  339.     return 0;