D3D trianglefan (三角形扇区) 小例子

来源:互联网 发布:手机制作mv软件 编辑:程序博客网 时间:2024/06/06 03:01

trianglefan (三角形扇区) 程序

#pragma once#pragma comment(lib,"d3d9.lib")#pragma comment(lib,"d3dx9.lib")#include<d3d9.h>#include<d3dx9.h>//TODO: -1 custom vertexstruct CUSTOMVERTEX{float x;float y;float z;float rhw;};#define D3DFVF_CUSTOMVERTEX D3DFVF_XYZRHWHRESULT InitD3D(HWND hWnd);void CleanUp();void Render();LRESULT CALLBACK MsgProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam);HRESULT InitD3DVertexBuffer();//TODO: 0 declare d3d variables.LPDIRECT3D9 g_pd3d = NULL;LPDIRECT3DDEVICE9 g_pd3dDevice9 = NULL;LPDIRECT3DVERTEXBUFFER9 g_pd3dVB = NULL;//application entry point.INT WINAPI wWinMain(HINSTANCE,HINSTANCE,LPWSTR,INT){//initialize wnd class.WNDCLASSEX wcex;ZeroMemory(&wcex,sizeof(wcex));wcex.cbSize=sizeof(wcex);  wcex.hInstance=GetModuleHandle(NULL);  wcex.lpfnWndProc=MsgProc;  wcex.lpszClassName=L"Self001";  wcex.style=CS_CLASSDC;  //register wnd class.RegisterClassEx(&wcex);//create window.HWND hWnd=CreateWindowEx(WS_EX_OVERLAPPEDWINDOW,L"Self001",L"Self001 Window",WS_OVERLAPPEDWINDOW,100,100,300,300,NULL,NULL,wcex.hInstance,NULL);//init d3dif(SUCCEEDED(InitD3D(hWnd))){//show window.ShowWindow(hWnd,SW_SHOWDEFAULT);UpdateWindow(hWnd);//message loop.MSG msg;ZeroMemory(&msg,sizeof(msg));while(msg.message != WM_QUIT){if(PeekMessage(&msg,hWnd,0,0,PM_REMOVE)){TranslateMessage(&msg);DispatchMessage(&msg);}else{Render();}}}//unregister wnd class.UnregisterClass(L"Self001",wcex.hInstance);return 0;}//init d3d.HRESULT InitD3D(HWND hWnd){//create d3d.g_pd3d=Direct3DCreate9(D3D_SDK_VERSION);if(g_pd3d == NULL){return E_FAIL;}//initialize d3d present parameters.D3DPRESENT_PARAMETERS d3dpp;ZeroMemory(&d3dpp,sizeof(d3dpp));d3dpp.Windowed=TRUE;d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;d3dpp.BackBufferFormat=D3DFMT_UNKNOWN;//create d3d device.if(FAILED(g_pd3d->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,&g_pd3dDevice9))){return E_FAIL;}//init vertex buffer.if(FAILED(InitD3DVertexBuffer())){return E_FAIL;}return S_OK;}//clean up d3d.void CleanUp(){//TODO: 3 clean up d3d.if(g_pd3dVB != NULL){g_pd3dVB->Release();}//release device.if(g_pd3dDevice9 != NULL){g_pd3dDevice9->Release();}//release d3d.if(g_pd3d != NULL){g_pd3d->Release();}}//render the scene.void Render(){//clear target.g_pd3dDevice9->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,0),1.0f,0);//draw primitive.if(SUCCEEDED(g_pd3dDevice9->BeginScene())){//TODO: 2 render d3d.g_pd3dDevice9->SetStreamSource(0,g_pd3dVB,0,sizeof(CUSTOMVERTEX));g_pd3dDevice9->SetFVF(D3DFVF_CUSTOMVERTEX);g_pd3dDevice9->DrawPrimitive(D3DPT_TRIANGLEFAN,0,4);g_pd3dDevice9->EndScene();}//present sence.g_pd3dDevice9->Present(NULL,NULL,NULL,NULL);}//window message handler.LRESULT CALLBACK MsgProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam){switch(msg){case WM_DESTROY:CleanUp();return 0L;}return DefWindowProc(hWnd,msg,wParam,lParam);}//init d3d vertex buffer.HRESULT InitD3DVertexBuffer(){//TODO: 1 init vertex buffer data.//create vertex data.CUSTOMVERTEX vertices[]={{150.0f,150.0f,1.0f,1.0f},{50.0f,50.0f,1.0f,1.0f},{100.0f,50.0f,1.0f,1.0f},{250.0f,150.0f,1.0f,1.0f},{125.0f,250.0f,1.0f,1.0f},{50.0f,50.0f,1.0f,1.0f}};//create vertex buffer.if(FAILED(g_pd3dDevice9->CreateVertexBuffer(sizeof(vertices),0,D3DFVF_CUSTOMVERTEX,D3DPOOL_DEFAULT,&g_pd3dVB,NULL))){return E_FAIL;}//fill vertex buffer.void* pVertices=NULL;if(FAILED(g_pd3dVB->Lock(0,sizeof(vertices),&pVertices,0))){return E_FAIL;}memcpy(pVertices,vertices,sizeof(vertices));g_pd3dVB->Unlock();return S_OK;}

程序结果

1. 由于三角形是填充的效果不是很明显,但是我知道这个不是四边形就是了。

0 0