图元
三维图元是组成单个三维实体的顶点集合。在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 : [email protected] * 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; }