Contents
注:开发环境设定参考 上篇文章 DirectX 9.0 C++ 教程 开发环境设定
也可以参考下这篇Android Opengl ES下绘制三角形
本例子效果图(来源 DirectX 9.0 SDK):
1.定义一个自定义的顶点(Vertex)类型
// A structure for our custom vertex type struct CUSTOMVERTEX { FLOAT x, y, z, rhw; // The transformed position for the vertex DWORD color; // The vertex color }; //这里加入了颜色,后面设计到纹理(Texture)时,还可以加入纹理属性 struct CUSTOMVERTEX { FLOAT x,y,z,rhw; DWORD color; FLOAT u,v; //texture coordinate }
2. 设置顶点缓存(Setting Up the Vertex Buffer)
// 初始化三个顶点 CUSTOMVERTEX Vertices[] = { { 150.0f, 50.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(255,0,0), }, // x, y, z, rhw, color //颜色为蓝色 { 250.0f, 250.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(0,255,0), },//颜色为绿色 { 50.0f, 250.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(0,0,255), },//颜色为蓝色 }; LPDIRECT3DVERTEXBUFFER9 g_pVB = NULL; // Buffer to hold Vertices // 创建顶点缓存 #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE) if( FAILED( g_pd3dDevice->CreateVertexBuffer( 3*sizeof(CUSTOMVERTEX), //空间大小,3个点故乘以3 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();
3.绘制三角形(Rendering the Display)
// Clear the backbuffer to a blue color g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 1.0f, 0 ); // Begin the scene if( SUCCEEDED( g_pd3dDevice->BeginScene() ) ) { //Binds a vertex buffer to a device data stream g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEX) ); g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );//FVF 指flexible vertex format g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, 1 ); //D3DPT_TRIANGLELIST表示三角形 // End the scene g_pd3dDevice->EndScene(); } // Present the backbuffer contents to the display g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
4.上面设计到的一些函数解释
//CreateVertexBuffer 函数原型 HRESULT CreateVertexBuffer( UINT Length, //长度,size of vertex buffer DWORD Usage, //未使用D3DUSAGE_DYNAMIC,则为静态缓存,地形或城市建筑适合 DWORD FVF, //这里用了D3DFVF_XYZRHW和D3DFVF_DIFFUSE,因为顶点定义包含了rhw和颜色 D3DPOOL Pool,//D3DPOOL_DEFAULT IDirect3DVertexBuffer9** ppVertexBuffer, HANDLE* pSharedHandle//保留参数,未使用,设置为NULL); //DrawPrimitive 函数原型 HRESULT DrawPrimitive( D3DPRIMITIVETYPE PrimitiveType,// D3DPT_POINTLIST点,LINELIST线,D3DPT_TRIANGLELIST三角形 等 UINT StartVertex, //index of first vertex to load UINT PrimitiveCount //数量 );
5.全部源码
//----------------------------------------------------------------------------- // File: Vertices.cpp // // Desc: In this tutorial, we are rendering some Vertices. This introduces the // concept of the vertex buffer, a Direct3D object used to store // Vertices. Vertices can be defined any way we want by defining a // custom structure and a custom FVF (flexible vertex format). In this // tutorial, we are using Vertices that are transformed (meaning they // are already in 2D window coordinates) and lit (meaning we are not // using Direct3D lighting, but are supplying our own colors). // // Copyright (c) Microsoft Corporation. All rights reserved. //----------------------------------------------------------------------------- #include <d3d9.h> #include <strsafe.h> //----------------------------------------------------------------------------- // Global variables //----------------------------------------------------------------------------- LPDIRECT3D9 g_pD3D = NULL; // Used to create the D3DDevice LPDIRECT3DDEVICE9 g_pd3dDevice = NULL; // Our rendering device LPDIRECT3DVERTEXBUFFER9 g_pVB = NULL; // Buffer to hold Vertices // 三角形顶点 结构体 struct CUSTOMVERTEX { FLOAT x, y, z, rhw; // The transformed position for the vertex DWORD color; // The vertex color }; // Our custom FVF, which describes our custom vertex structure #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE) //----------------------------------------------------------------------------- // Name: InitD3D() // Desc: Initializes Direct3D //----------------------------------------------------------------------------- HRESULT InitD3D( HWND hWnd ) { // Create the D3D object. if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) ) return E_FAIL; // 初始化 D3DPRESENT_PARAMETERS 结构体 D3DPRESENT_PARAMETERS d3dpp; ZeroMemory( &d3dpp, sizeof(d3dpp) ); d3dpp.Windowed = TRUE; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.BackBufferFormat = D3DFMT_UNKNOWN; // 创建 D3DDevice if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_pd3dDevice ) ) ) { return E_FAIL; } // Device state would normally be set here return S_OK; } //----------------------------------------------------------------------------- // Name: InitVB() // Desc: Creates a vertex buffer and fills it with our Vertices. The vertex // buffer is basically just a chuck of memory that holds Vertices. After // creating it, we must Lock()/Unlock() it to fill it. For indices, D3D // also uses index buffers. The special thing about vertex and index // buffers is that they can be created in device memory, allowing some // cards to process them in hardware, resulting in a dramatic // performance gain. //----------------------------------------------------------------------------- HRESULT InitVB() { // 初始化三角形的三个顶点坐标 CUSTOMVERTEX Vertices[] = { { 150.0f, 50.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(255,0,0), }, // x, y, z, rhw, color { 250.0f, 250.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(0,255,0), }, { 50.0f, 250.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(0,0,255), }, }; // 创建 顶点buffer if( FAILED( g_pd3dDevice->CreateVertexBuffer( 3*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: Releases all previously initialized objects //----------------------------------------------------------------------------- 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: Draws the scene //----------------------------------------------------------------------------- VOID Render() { // Clear the backbuffer to a blue color g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 1.0f, 0 ); // Begin the scene if( SUCCEEDED( g_pd3dDevice->BeginScene() ) ) { g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEX) ); g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX ); //绘制三角形 g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, 1 ); // End the scene g_pd3dDevice->EndScene(); } // Present the backbuffer contents to the display g_pd3dDevice->Present( NULL, NULL, NULL, NULL ); } //----------------------------------------------------------------------------- // Name: MsgProc() // Desc: The window's message handler //----------------------------------------------------------------------------- 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: The application's entry point //----------------------------------------------------------------------------- INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT ) { // Register the window class WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L, GetModuleHandle(NULL), NULL, NULL, NULL, NULL, "D3D Tutorial", NULL }; RegisterClassEx( &wc ); // Create the application's window HWND hWnd = CreateWindow( "D3D Tutorial", "D3D Tutorial 02: Vertices", WS_OVERLAPPEDWINDOW, 100, 100, 300, 300, GetDesktopWindow(), NULL, wc.hInstance, NULL ); // Initialize Direct3D if( SUCCEEDED( InitD3D( hWnd ) ) ) { // Create the vertex buffer if( SUCCEEDED( InitVB() ) ) { // Show the window ShowWindow( hWnd, SW_SHOWDEFAULT ); UpdateWindow( hWnd ); // Enter the message loop 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 Tutorial", wc.hInstance ); return 0; }
Project下载:
http://download.csdn.net/detail/fox64194167/4608955 (CSDN下载,免积分)
Vertices(本站下载)
相关文章:
4.DirectX 9.0 C++ 教程 关于Perspective projection,Matrices,摄像头,旋转
6.DirectX 9.0 C++ 教程 Texture 纹理映射
208
[…] 3.DirectX 9.0 C++ 教程 绘制三角形 […]
[…] 3.DirectX 9.0 C++ 教程 绘制三角形 […]
[…] 3.DirectX 9.0 C++ 教程 绘制三角形 […]
[…] 3.DirectX 9.0 C++ 教程 绘制三角形 […]