图元
三维图元是组成单个三维实体的顶点集合。在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
- /*
- * File : Graphics.cpp
- * Description : Draw some graphics on the screen
- * Author : GuoShaoHao
- * E-mail : gsh0913@qq.com
- * Date : 2010/12/06
- *
- * CopyRight @ South China Institute of Software Engineering,.GZU
- *
- */
- #include <d3d9.h>
- #include <d3dx9.h>
- //-----------------------------------------------------------------------------
- // 全局变量
- //-----------------------------------------------------------------------------
- LPDIRECT3D9 g_pD3D = NULL; // 用于创建D3D设备
- LPDIRECT3DDEVICE9 g_pd3dDevice = NULL; // 用于创建渲染设备
- LPDIRECT3DVERTEXBUFFER9 g_pVB = NULL; // 用于创建顶点缓冲
- // 顶点结构体
- struct CUSTOMVERTEX
- {
- FLOAT x, y, z; // 顶点位置
- DWORD color; // 顶点颜色
- };
- // 顶点结构体
- #define D3DFVF_CUSTOMVERTEX ( D3DFVF_XYZ | D3DFVF_DIFFUSE )
- //-----------------------------------------------------------------------------
- // Name: InitD3D()
- // Desc: 初始化D3D
- //-----------------------------------------------------------------------------
- HRESULT InitD3D( HWND hWnd )
- {
- // 创建D3D对象
- if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
- return E_FAIL;
- // 创建结构用于创建D3D设备
- D3DPRESENT_PARAMETERS d3dpp;
- ZeroMemory( &d3dpp, sizeof( d3dpp ) );
- d3dpp.Windowed = TRUE;
- d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
- d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
- // 创建D3D设备
- if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT,
- D3DDEVTYPE_HAL,
- hWnd,
- D3DCREATE_SOFTWARE_VERTEXPROCESSING,
- &d3dpp,
- &g_pd3dDevice ) ) )
- {
- return E_FAIL;
- }
- // 设置设备状态
- // 设置渲染格式
- g_pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );
- // 关闭光照
- g_pd3dDevice->SetRenderState( D3DRS_LIGHTING, FALSE );
- return S_OK;
- }
- //-----------------------------------------------------------------------------
- // Name: InitVB()
- // Desc: 初始化顶点缓冲
- //-----------------------------------------------------------------------------
- HRESULT InitVB()
- {
- // 初始化顶点
- CUSTOMVERTEX vertices[] =
- {
- { -2.5f, -2.0f, 0.0f, 0xffff0000, }, // x, y, z, color
- { -1.5f, 1.0f, 0.0f, 0xffff0000, },
- { -0.5f, -2.0f, 0.0f, 0xffff0000, },
- { 0.5f, 1.0f, 0.0f, 0xffff0000, },
- { 1.5f, -2.0f, 0.0f, 0xffff0000, },
- { 2.5f, 1.0f, 0.0f, 0xffff0000, },
- };
- // 创建顶点缓冲
- if( FAILED( g_pd3dDevice->CreateVertexBuffer( 9*sizeof( CUSTOMVERTEX ),
- 0,
- D3DFVF_CUSTOMVERTEX,
- D3DPOOL_DEFAULT,
- &g_pVB, NULL ) ) )
- {
- return E_FAIL;
- }
- // 顶点缓冲的锁定/解锁
- VOID* pVertices;
- if( FAILED( g_pVB->Lock( 0, sizeof(vertices), (void**)&pVertices, 0 ) ) )
- return E_FAIL;
- memcpy( pVertices, vertices, sizeof(vertices) );
- g_pVB->Unlock();
- return S_OK;
- }
- //-----------------------------------------------------------------------------
- // Name: Cleanup()
- // Desc: 释放对象资源
- //-----------------------------------------------------------------------------
- VOID Cleanup()
- {
- if( g_pVB != NULL )
- g_pVB->Release();
- if( g_pd3dDevice != NULL )
- g_pd3dDevice->Release();
- if( g_pD3D != NULL )
- g_pD3D->Release();
- }
- //-----------------------------------------------------------------------------
- // Name: Render()
- // Desc: 场景渲染
- //-----------------------------------------------------------------------------
- VOID Render()
- {
- // 清除场景背景
- g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 1.0f, 0 );
- // 场景开始渲染
- if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
- {
- // 定义视图矩阵
- D3DXMATRIXA16 matProj;
- // 透视投影
- //D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI / 4, 1.0f, 1.0f, 100.0f );
- // 平行投影
- D3DXMatrixOrthoLH( &matProj, 10.0f, 10.0f, 0.0f, 100.0f);
- g_pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj );
- g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEX) );
- g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
- // 以不同的方式绘制图元
- // Triangle Lists
- g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, 1 );
- g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 3, 1 );
- // Point Lists
- //g_pd3dDevice->DrawPrimitive( D3DPT_POINTLIST, 0, 6);
- // Line Lists
- //g_pd3dDevice->DrawPrimitive(D3DPT_LINELIST, 0, 3);
- // Line Strips
- //g_pd3dDevice->DrawPrimitive(D3DPT_LINESTRIP, 0, 5);
- // Triangle Strips
- //g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 4);
- // Triangle Fans
- //g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLEFAN, 0, 4);
- // 场景结束渲染
- g_pd3dDevice->EndScene();
- }
- // 提交缓冲
- g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
- }
- //-----------------------------------------------------------------------------
- // Name: MsgProc()
- // Desc: 窗口消息句柄
- //-----------------------------------------------------------------------------
- LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
- {
- switch( msg )
- {
- case WM_DESTROY:
- Cleanup();
- PostQuitMessage( 0 );
- return 0;
- }
- return DefWindowProc( hWnd, msg, wParam, lParam );
- }
- //-----------------------------------------------------------------------------
- // Name: WinMain()
- // Desc: 应用程序入口
- //-----------------------------------------------------------------------------
- INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT )
- {
- // 注册窗口类
- WNDCLASSEX wc = { sizeof(WNDCLASSEX),
- CS_CLASSDC,
- MsgProc,
- 0L,
- 0L,
- GetModuleHandle(NULL),
- NULL,
- NULL,
- NULL,
- NULL,
- "D3D Project", NULL };
- RegisterClassEx( &wc );
- // 创建应用程序窗口
- HWND hWnd = CreateWindow( "D3D Project",
- "D3D Project",
- WS_OVERLAPPEDWINDOW,
- 100,
- 100,
- 800,
- 600,
- GetDesktopWindow(),
- NULL,
- wc.hInstance,
- NULL );
- // 初始化D3D
- if( SUCCEEDED( InitD3D( hWnd ) ) )
- {
- // 创建顶点缓冲
- if( SUCCEEDED( InitVB() ) )
- {
- // 显示窗体
- ShowWindow( hWnd, SW_SHOWDEFAULT );
- UpdateWindow( hWnd );
- // 进入消息循环
- MSG msg;
- ZeroMemory( &msg, sizeof( msg ) );
- while( msg.message != WM_QUIT )
- {
- if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
- {
- TranslateMessage( &msg );
- DispatchMessage( &msg );
- }
- else
- {
- //开始渲染
- Render();
- }
- }
- }
- }
- UnregisterClass( "D3D Project", wc.hInstance );
- return 0;
- }