D3D纹理小例

来源:互联网 发布:矩阵论 方保镕 答案pdf 编辑:程序博客网 时间:2024/05/16 10:21
#include <d3dx9.h>//-----------------------------------------------------------------------------// Desc: 全局变量//-----------------------------------------------------------------------------LPDIRECT3D9             g_pD3D       = NULL;    //Direct3D对象LPDIRECT3DDEVICE9       g_pd3dDevice = NULL;    //Direct3D设备对象LPDIRECT3DTEXTURE9      g_pTex       = NULL;    //纹理LPD3DXSPRITE            g_pSprite    = NULL;    //点精灵//-----------------------------------------------------------------------------// Desc: 初始化Direct3D//-----------------------------------------------------------------------------bool InitATexture(int iX, int iY){// 默认是 32bit D3DFMT_A8R8G8B8if(g_pd3dDevice->CreateTexture(iX,iY,1,D3DUSAGE_DYNAMIC,D3DFMT_A8R8G8B8,D3DPOOL_DEFAULT,&g_pTex,NULL) != D3D_OK)return false;D3DLOCKED_RECT LockedRect;if(g_pTex->LockRect(0,&LockedRect,NULL,D3DLOCK_DISCARD) != D3D_OK)return false;int iTextureSize=iX*iY*4;unsigned char *pucSourceData=new unsigned char[iTextureSize];ZeroMemory(pucSourceData,iTextureSize);/*这里你要对pdwSourceData的内容初始化,我只做了一个ZeroMemory,这样做的后果就是图片时全黑的*/memcpy(LockedRect.pBits,pucSourceData,iTextureSize);delete[]pucSourceData;g_pTex->UnlockRect(0);return true;}HRESULT InitD3D( HWND hWnd ){//创建Direct3D对象, 该对象用于创建Direct3D设备对象if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )return E_FAIL;//设置D3DPRESENT_PARAMETERS结构, 准备创建Direct3D设备对象D3DPRESENT_PARAMETERS d3dpp;ZeroMemory( &d3dpp, sizeof(d3dpp) );d3dpp.Windowed = TRUE;d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;//创建Direct3D设备对象if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp, &g_pd3dDevice ) ) ){return E_FAIL;}// 创建点精灵if (FAILED(D3DXCreateSprite( g_pd3dDevice, &g_pSprite ))){return E_FAIL;}//加载纹理if(!InitATexture(200,200)) {return E_FAIL;}//if (FAILED(D3DXCreateTextureFromFile(g_pd3dDevice, L"Image1.jpg", &g_pTex)))//{//return E_FAIL;//}return S_OK;}//-----------------------------------------------------------------------------// Desc: 释放创建的对象//-----------------------------------------------------------------------------VOID Cleanup(){//释放纹理if(g_pTex != NULL){g_pTex->Release();}//释放点精灵if (g_pSprite != NULL){g_pSprite->Release();}//释放Direct3D设备对象if( g_pd3dDevice != NULL ) g_pd3dDevice->Release();//释放Direct3D对象if( g_pD3D != NULL )       g_pD3D->Release();}//-----------------------------------------------------------------------------// Desc: 渲染图形 //-----------------------------------------------------------------------------VOID Render(){//清空后台缓冲区g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(45, 50, 170), 1.0f, 0 );//开始在后台缓冲区绘制图形if( SUCCEEDED( g_pd3dDevice->BeginScene() ) ){if ( SUCCEEDED( g_pSprite->Begin(D3DXSPRITE_ALPHABLEND) ) ){g_pSprite->Draw(g_pTex, NULL, NULL, NULL, 0xffffffff);g_pSprite->End();}//结束在后台缓冲区绘制图形g_pd3dDevice->EndScene();}//将在后台缓冲区绘制的图形提交到前台缓冲区显示g_pd3dDevice->Present( NULL, NULL, NULL, NULL );}//-----------------------------------------------------------------------------// 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 );}//-----------------------------------------------------------------------------// Desc: 入口函数//-----------------------------------------------------------------------------INT main( HINSTANCE hInst, HINSTANCE, LPSTR, INT ){//注册窗口类WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,GetModuleHandle(NULL), NULL, NULL, NULL, NULL,L"ClassName", NULL };RegisterClassEx( &wc );//创建窗口HWND hWnd = CreateWindow( L"ClassName", L"顶点缓冲区",WS_OVERLAPPEDWINDOW, 200, 100, 800, 600,GetDesktopWindow(), NULL, wc.hInstance, NULL );//初始化Direct3Dif( SUCCEEDED( InitD3D( hWnd ) ) ){//创建并填充顶点缓冲区if( SUCCEEDED( TRUE ) ){//显示窗口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(L"ClassName", wc.hInstance);return 0;}


 

0 0
原创粉丝点击