现在的位置: 首页 > 综合 > 正文

D3D基本图元和顶点缓冲

2013年02月03日 ⁄ 综合 ⁄ 共 9251字 ⁄ 字号 评论关闭
 

图元

 

三维图元是组成单个三维实体的顶点集合。在D3D中,一共有三种基本图元,分别是点、线和三角形。

通常三维图元是多边形。一个多边形是由至少三个顶点描绘的三维形体。最简单的多边形是三角形。Direct3D使用三角形组成大多数多边形,因为三角形的三个顶点一定是共面的。应用程序可以用三角形组合成大而复杂的多边形及网格(mesh)。

 

 

绘制基本图元

 

所有的 3D 图形都是由三角形构成的。为什么是三角形而不是别的图形呢?因为三角形有许多优越之处,例如:绘制效率。而且我们知道,任意不在同一条直线上的三个点都能构成三角形,这对于在空间中形成某种复杂图形是很有益处的。所以,如果我们想得到一个矩形,最有效率的是绘制两个相同的合并的三角形,这样要优于直接绘制一个矩形。 

 

 

顶点

 

顶点(vertex) 就是3D空间中的一个点。例如,三角形有三个顶点,而矩形有四个。在3D空间中,可以用三个顶点来指定一个三角形。要理解顶点,我们首先要理解笛卡尔坐标系。

 

 

3D Primitives

 

Primitive 为“原始”之意,3D primitive 就是设备所支持的原始的类型。 通常我们也把它们称作“图元”。Primitive包括:点列、线列、线带、三角形列、三角形带 和 三角扇形。 

 

 

下面是各种图元的示例

 

 

Point Lists

 

 

 

 

Line Lists

 

 

 

 

Line Strips

 

 

 

 

Triangle Lists

 

 

 

Triangle Strips 

 

 

 

Triangle Fans

 

 

 

 

FVF(灵活顶点格式)

 

灵活顶点格式(FVF)是用来描述顶点属性的一种格式,而这种格式是可以由我们自定义的,所以称它为“灵活顶点格式”。至此,我们至少知道了顶点有三种属性:x值、y值和z值。其实顶点还可以有其他属性,例如颜色。利用灵活顶点格式(FVF)我们能方便的指定顶点的属性。

 

 

Vertex Buffers (顶点缓冲) 

 

顶点缓冲就是一块用于保存顶点的内存缓冲区。顶点缓冲可以保存任何的顶点类型。当一些顶点已经被保存在顶点缓冲区中,就可以通过程序操作它们,例如渲染、变换等。

 

 

Colours (颜色)

 

在DirectX中,如果我们要指定一种颜色,我们可以用D3DCOLOR_XRGB宏。宏中有三个参数,每个参数都是0到255间的整数值,分别用于描述颜色的红、绿、蓝分量。

 

例如:

 

D3DCOLOR_XRGB(0, 0, 0) 是黑色。

D3DCOLOR_XRGB(255, 255, 255) 是纯白色。

D3DCOLOR_XRGB(0, 255, 0) 是亮绿色(没有红与蓝,全是绿色的分量)。

D3DCOLOR_XRGB(100, 20, 100) 是暗紫色 (100 红, 20 绿, 100 蓝)。

 

 

渲染顶点

 

Direct3D 写的应用程序使用顶点(Vertex)构造几何物体。每一个三维空间 (3D) 场景包括一个或几个这样的几何物体 。

 

 

用顶点构造一个几何物体应该采用以下步骤:

 

 

1 定义一个自定义顶点类型

2 创建顶点缓冲

3 渲染到显示屏 

 

 

 

 

 

 

 

下面的代码将用不同的方式绘制图元:

 

 

程序截图

 

程序源代码的下载地址:http://download.csdn.net/source/2906693

 

  1. /* 
  2.  * File        : Graphics.cpp 
  3.  * Description : Draw some graphics on the screen 
  4.  * Author      : GuoShaoHao 
  5.  * E-mail      : gsh0913@qq.com 
  6.  * Date        : 2010/12/06 
  7.  *  
  8.  * CopyRight @ South China Institute of Software Engineering,.GZU 
  9.  * 
  10.  */  
  11.   
  12. #include <d3d9.h>   
  13. #include <d3dx9.h>   
  14.   
  15. //-----------------------------------------------------------------------------   
  16. // 全局变量   
  17. //-----------------------------------------------------------------------------   
  18. LPDIRECT3D9             g_pD3D       = NULL; // 用于创建D3D设备   
  19. LPDIRECT3DDEVICE9       g_pd3dDevice = NULL; // 用于创建渲染设备   
  20. LPDIRECT3DVERTEXBUFFER9 g_pVB        = NULL; // 用于创建顶点缓冲   
  21.   
  22. // 顶点结构体   
  23. struct CUSTOMVERTEX  
  24. {  
  25.     FLOAT x, y, z;   // 顶点位置   
  26.     DWORD color;     // 顶点颜色   
  27. };  
  28.   
  29. // 顶点结构体   
  30. #define D3DFVF_CUSTOMVERTEX ( D3DFVF_XYZ | D3DFVF_DIFFUSE )   
  31.   
  32. //-----------------------------------------------------------------------------   
  33. // Name: InitD3D()   
  34. // Desc: 初始化D3D   
  35. //-----------------------------------------------------------------------------   
  36. HRESULT InitD3D( HWND hWnd )  
  37. {  
  38.     // 创建D3D对象   
  39.     if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )  
  40.         return E_FAIL;  
  41.   
  42.     // 创建结构用于创建D3D设备   
  43.     D3DPRESENT_PARAMETERS d3dpp;  
  44.     ZeroMemory( &d3dpp, sizeof( d3dpp ) );  
  45.   
  46.     d3dpp.Windowed         = TRUE;  
  47.     d3dpp.SwapEffect       = D3DSWAPEFFECT_DISCARD;  
  48.     d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;  
  49.   
  50.     // 创建D3D设备   
  51.     if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT,   
  52.                                       D3DDEVTYPE_HAL,   
  53.                                       hWnd,  
  54.                                       D3DCREATE_SOFTWARE_VERTEXPROCESSING,  
  55.                                       &d3dpp,   
  56.                                       &g_pd3dDevice ) ) )  
  57.     {  
  58.         return E_FAIL;  
  59.     }  
  60.   
  61.     // 设置设备状态   
  62.   
  63.     // 设置渲染格式   
  64.     g_pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );  
  65.   
  66.     // 关闭光照   
  67.     g_pd3dDevice->SetRenderState( D3DRS_LIGHTING, FALSE );  
  68.   
  69.     return S_OK;  
  70. }  
  71.   
  72.   
  73. //-----------------------------------------------------------------------------   
  74. // Name: InitVB()   
  75. // Desc: 初始化顶点缓冲   
  76. //-----------------------------------------------------------------------------   
  77. HRESULT InitVB()  
  78. {  
  79.   
  80.     // 初始化顶点   
  81.     CUSTOMVERTEX vertices[] =  
  82.     {  
  83.         { -2.5f, -2.0f, 0.0f, 0xffff0000, }, // x, y, z, color   
  84.         { -1.5f,  1.0f, 0.0f, 0xffff0000, },  
  85.         { -0.5f, -2.0f, 0.0f, 0xffff0000, },  
  86.   
  87.         {  0.5f,  1.0f, 0.0f, 0xffff0000, },  
  88.         {  1.5f, -2.0f, 0.0f, 0xffff0000, },  
  89.         {  2.5f,  1.0f, 0.0f, 0xffff0000, },  
  90.   
  91.     };  
  92.   
  93.   
  94.     // 创建顶点缓冲   
  95.     if( FAILED( g_pd3dDevice->CreateVertexBuffer( 9*sizeof( CUSTOMVERTEX ),  
  96.                                                   0,   
  97.                                                   D3DFVF_CUSTOMVERTEX,  
  98.                                                   D3DPOOL_DEFAULT,   
  99.                                                   &g_pVB, NULL ) ) )  
  100.     {  
  101.         return E_FAIL;  
  102.     }  
  103.   
  104.     // 顶点缓冲的锁定/解锁   
  105.   
  106.     VOID* pVertices;  
  107.   
  108.     if( FAILED( g_pVB->Lock( 0, sizeof(vertices), (void**)&pVertices, 0 ) ) )  
  109.         return E_FAIL;  
  110.   
  111.     memcpy( pVertices, vertices, sizeof(vertices) );  
  112.     g_pVB->Unlock();  
  113.   
  114.     return S_OK;  
  115. }  
  116.   
  117.   
  118. //-----------------------------------------------------------------------------   
  119. // Name: Cleanup()   
  120. // Desc: 释放对象资源   
  121. //-----------------------------------------------------------------------------   
  122. VOID Cleanup()  
  123. {  
  124.   
  125.     if( g_pVB != NULL )          
  126.         g_pVB->Release();  
  127.   
  128.     if( g_pd3dDevice != NULL )   
  129.         g_pd3dDevice->Release();  
  130.   
  131.     if( g_pD3D != NULL )         
  132.         g_pD3D->Release();  
  133.   
  134. }  
  135.   
  136.   
  137. //-----------------------------------------------------------------------------   
  138. // Name: Render()   
  139. // Desc: 场景渲染   
  140. //-----------------------------------------------------------------------------   
  141. VOID Render()  
  142. {  
  143.     // 清除场景背景   
  144.     g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 1.0f, 0 );  
  145.   
  146.     // 场景开始渲染   
  147.     if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )  
  148.     {  
  149.   
  150.         // 定义视图矩阵   
  151.         D3DXMATRIXA16 matProj;  
  152.   
  153.         // 透视投影   
  154.         //D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI / 4, 1.0f, 1.0f, 100.0f );   
  155.   
  156.         // 平行投影   
  157.         D3DXMatrixOrthoLH( &matProj, 10.0f, 10.0f, 0.0f, 100.0f);  
  158.   
  159.         g_pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj );  
  160.   
  161.         g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEX) );  
  162.         g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );  
  163.   
  164.         // 以不同的方式绘制图元   
  165.   
  166.         // Triangle Lists   
  167.         g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, 1 );  
  168.         g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 3, 1 );  
  169.           
  170.         // Point Lists   
  171.         //g_pd3dDevice->DrawPrimitive( D3DPT_POINTLIST, 0, 6);   
  172.   
  173.         // Line Lists   
  174.         //g_pd3dDevice->DrawPrimitive(D3DPT_LINELIST, 0, 3);   
  175.   
  176.         // Line Strips   
  177.         //g_pd3dDevice->DrawPrimitive(D3DPT_LINESTRIP, 0, 5);   
  178.   
  179.         // Triangle Strips   
  180.         //g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 4);   
  181.   
  182.         // Triangle Fans   
  183.         //g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLEFAN, 0, 4);   
  184.           
  185.           
  186.   
  187.         // 场景结束渲染   
  188.         g_pd3dDevice->EndScene();  
  189.   
  190.     }  
  191.   
  192.     // 提交缓冲   
  193.     g_pd3dDevice->Present( NULL, NULL, NULL, NULL );  
  194.   
  195. }  
  196.   
  197.   
  198. //-----------------------------------------------------------------------------   
  199. // Name: MsgProc()   
  200. // Desc: 窗口消息句柄   
  201. //-----------------------------------------------------------------------------   
  202. LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )  
  203. {  
  204.   
  205.     switch( msg )  
  206.     {  
  207.         case WM_DESTROY:  
  208.             Cleanup();  
  209.             PostQuitMessage( 0 );  
  210.             return 0;  
  211.     }  
  212.   
  213.     return DefWindowProc( hWnd, msg, wParam, lParam );  
  214. }  
  215.   
  216.   
  217. //-----------------------------------------------------------------------------   
  218. // Name: WinMain()   
  219. // Desc: 应用程序入口   
  220. //-----------------------------------------------------------------------------   
  221. INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT )  
  222. {  
  223.     // 注册窗口类   
  224.     WNDCLASSEX wc = { sizeof(WNDCLASSEX),   
  225.                       CS_CLASSDC,   
  226.                       MsgProc,   
  227.                       0L,   
  228.                       0L,  
  229.                       GetModuleHandle(NULL),   
  230.                       NULL,   
  231.                       NULL,   
  232.                       NULL,   
  233.                       NULL,  
  234.                       "D3D Project", NULL };  
  235.   
  236.     RegisterClassEx( &wc );  
  237.   
  238.     // 创建应用程序窗口   
  239.     HWND hWnd = CreateWindow( "D3D Project",   
  240.                               "D3D Project",  
  241.                               WS_OVERLAPPEDWINDOW,   
  242.                               100,   
  243.                               100,   
  244.                               800,   
  245.                               600,  
  246.                               GetDesktopWindow(),   
  247.                               NULL,   
  248.                               wc.hInstance,   
  249.                               NULL );  
  250.   
  251.     // 初始化D3D   
  252.     if( SUCCEEDED( InitD3D( hWnd ) ) )  
  253.     {  
  254.         // 创建顶点缓冲   
  255.         if( SUCCEEDED( InitVB() ) )  
  256.         {  
  257.             // 显示窗体   
  258.             ShowWindow( hWnd, SW_SHOWDEFAULT );  
  259.             UpdateWindow( hWnd );  
  260.   
  261.             // 进入消息循环   
  262.             MSG msg;  
  263.             ZeroMemory( &msg, sizeof( msg ) );  
  264.   
  265.             while( msg.message != WM_QUIT )  
  266.             {  
  267.                 if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )  
  268.                 {  
  269.                     TranslateMessage( &msg );  
  270.                     DispatchMessage( &msg );  
  271.                 }  
  272.                 else  
  273.                 {  
  274.                     //开始渲染   
  275.                     Render();  
  276.                 }  
  277.                       
  278.             }  
  279.         }  
  280.     }  
  281.   
  282.     UnregisterClass( "D3D Project", wc.hInstance );  
  283.   
  284.     return 0;  
  285. }  

原文地址:http://blog.csdn.net/tinya0913/article/details/6074030

抱歉!评论已关闭.