DX编程(3) —— 使用索引缓冲 创建2个三角形
2011-05-21 15:32
471 查看
#include <d3d9.h> #include <d3dx9effect.h> #include <math.h> #pragma comment(lib,"d3d9.lib") #pragma warning(disable : 4996) #include <strsafe.h> #pragma warning(default : 4996) LPDIRECT3D9 g_pD3D = NULL; LPDIRECT3DDEVICE9 g_pd3dDevice = NULL; LPDIRECT3DVERTEXBUFFER9 g_pVB = NULL; LPDIRECT3DINDEXBUFFER9 g_pIB = NULL; //索引缓冲区 HRESULT InitD3D(HWND hWnd) { if(NULL == (g_pD3D = Direct3DCreate9(D3D_SDK_VERSION))) return E_FAIL; D3DPRESENT_PARAMETERS d3dpp; ZeroMemory(&d3dpp,sizeof(d3dpp)); d3dpp.Windowed = TRUE; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.BackBufferFormat = D3DFMT_UNKNOWN; if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,&g_pd3dDevice))) return E_FAIL; return S_OK; } void Cleanup() { if(NULL != g_pVB) g_pVB->Release(); if(NULL != g_pIB) g_pIB->Release(); if(NULL != g_pd3dDevice) g_pd3dDevice->Release(); if(NULL != g_pD3D) g_pD3D->Release(); } /*****************************************************************************/ struct CUSTOMVERTEX { FLOAT x,y,z,rhw; DWORD color; }; #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW | D3DFVF_DIFFUSE) HRESULT InitVB() { CUSTOMVERTEX Vertices[] = { {200.0f, 150.0f, 0.5f, 1.0f, 0xffff0000,}, {400.0f, 0.0f, 0.5f, 1.0f, 0xff00ff00,}, {400.0f, 100.0f, 0.5f, 1.0f, 0xff0000ff,}, {400.0f, 200.0f, 0.5f, 1.0f, 0xffff0000,}, {400.0f, 300.0f, 0.5f, 1.0f, 0xff00ff00,}, }; if(FAILED(g_pd3dDevice->CreateVertexBuffer(5*sizeof(CUSTOMVERTEX),0,D3DFVF_CUSTOMVERTEX,D3DPOOL_DEFAULT,&g_pVB,NULL))) return E_FAIL; void *pVertices; if(FAILED(g_pVB->Lock(0,sizeof(Vertices),&pVertices,0))) return E_FAIL; memcpy(pVertices,Vertices,sizeof(Vertices)); g_pVB->Unlock(); //创建索引缓冲区 WORD Indices[] = {0,1,2, 0,3,4}; if(FAILED(g_pd3dDevice->CreateIndexBuffer(sizeof(Indices),0,D3DFMT_INDEX16,D3DPOOL_DEFAULT,&g_pIB,NULL))) return E_FAIL; //填充索引缓冲 void* pi; if(FAILED(g_pIB->Lock(0,sizeof(Indices),&pi,0))) return E_FAIL; memcpy(pi,Indices,sizeof(Indices)); g_pIB->Unlock(); return S_OK; } void Render() { if(NULL == g_pd3dDevice) return; g_pd3dDevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,0),1.0,0); if(SUCCEEDED(g_pd3dDevice->BeginScene())) { g_pd3dDevice->SetStreamSource(0,g_pVB,0,sizeof(CUSTOMVERTEX)); g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEX); //指定索引缓冲区 g_pd3dDevice->SetIndices(g_pIB); //渲染 与上次不同 g_pd3dDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,0,5,0,2); g_pd3dDevice->EndScene(); } g_pd3dDevice->Present(NULL,NULL,NULL,NULL); } /*****************************************************************************/ LRESULT CALLBACK WndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam) { switch(uMsg) { case WM_PAINT: Render(); ValidateRect(hWnd,NULL); break; case WM_DESTROY: Cleanup(); PostQuitMessage(0); break; default: break; } return DefWindowProc(hWnd,uMsg,wParam,lParam); } int WINAPI wWinMain( __in HINSTANCE hInstance, __in_opt HINSTANCE hPrevInstance, __in_opt LPWSTR lpCmdLine, __in int nShowCmd ) { WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hbrBackground = NULL; wcex.hCursor = NULL; wcex.hIcon = NULL; wcex.hIconSm = NULL; wcex.hInstance = GetModuleHandle(NULL); wcex.lpfnWndProc = WndProc; wcex.lpszClassName = L"First D3D Window"; wcex.lpszMenuName = NULL; wcex.style = CS_CLASSDC | CS_HREDRAW | CS_VREDRAW; RegisterClassEx(&wcex); HWND hWnd = CreateWindow(L"First D3D Window",L"第一个D3D窗口",WS_OVERLAPPEDWINDOW,0,0,600,400,GetDesktopWindow(),NULL, wcex.hInstance,NULL); if(SUCCEEDED(InitD3D(hWnd)) && SUCCEEDED(InitVB())) { ShowWindow(hWnd,SW_SHOWDEFAULT); UpdateWindow(hWnd); MSG msg; while (GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } } UnregisterClass(L"First D3D Window",wcex.hInstance); return 0; }
相关文章推荐
- [Slimdx]顶点和索引缓冲,绘制了2个分离的三角形
- 使用lucene3.6创建索引和实现简单搜索
- 基于hadoop创建lucene索引(一)编程模型一
- MySQL中索引的创建与使用
- SQL Server 索引的创建和使用
- Lucene学习之一:使用lucene为数据库表创建索引,并按关键字查询
- Lire使用实例:创建索引 搜索相似图片
- Oracle索引分析与比较(二)—— 各种索引的创建方法、使用场合及建议
- C# 多线程编程 - 使用委托创建线程
- CDH HBASE使用solr创建二级索引,更新删除索引
- “跨库导数据”、“事故处理”、“创建索引”、“使用触发器”等常用操作
- Windows编程 32位色彩正式教学 在Direct中使用双缓冲、三缓冲(Triple Buffering)
- 使用列索引创建筛选的视图
- 索引的创建及使用(sqlserver 2005)
- MySQL中创建和使用索引
- Windows下安装sphinx和创建索引及使用
- 使用to_date创建函数索引的时候经常会遇到ORA-01743错误
- SQL server索引 简介,创建与使用
- 【VS2010学习笔记】【编程实例】 (在Visual Studio中使用C++创建和使用DLL)
- 使用Java网络编程创建基于TCP协议的Server和Client