目的:
利用Direct3D實現圖片A半透明渲染到圖片B上面。
步驟:
1.建立標準WIN32程式,添加需要用到的對象定義和函式宣告:
CComPtr<IDirect3D9> pD3d9;<br />CComPtr<IDirect3DDevice9> pD3dDevice9;<br />CComPtr<IDirect3DTexture9> pTexture1;<br />CComPtr<IDirect3DTexture9> pTexture2;<br />D3DPRESENT_PARAMETERS gD3Dpp;</p><p>HRESULT Create(HWND hWnd);<br />HRESULT DrawTexture(IDirect3DTexture9* pTexture,<br />float fLeft, float fTop, float fRight, float fBottom, D3DCOLOR clr);<br />void SetState();<br />HRESULT Present();
2.建立需要的對象,即實現Create(HWND hWnd)函數:
HRESULT Create(HWND hWnd)<br />{<br />pD3d9 = Direct3DCreate9(D3D_SDK_VERSION);<br />if (pD3d9 == NULL)<br />{<br />return S_FALSE;<br />}</p><p>D3DCAPS9 caps;<br />pD3d9->GetDeviceCaps(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,&caps);<br />DWORD dwBF;<br />if (caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT)<br />{<br />dwBF = D3DCREATE_HARDWARE_VERTEXPROCESSING;<br />}<br />else<br />{<br />dwBF = D3DCREATE_SOFTWARE_VERTEXPROCESSING;<br />}<br />if (caps.DevCaps & D3DDEVCAPS_PUREDEVICE)<br />{<br />dwBF |= D3DCREATE_PUREDEVICE;<br />}</p><p>D3DDISPLAYMODE d3ddm;<br />pD3d9->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&d3ddm);<br />gD3Dpp.BackBufferCount = 1;<br />gD3Dpp.Windowed = TRUE;<br />gD3Dpp.hDeviceWindow = hWnd;<br />gD3Dpp.SwapEffect = D3DSWAPEFFECT_COPY;<br />gD3Dpp.BackBufferFormat = d3ddm.Format;</p><p>HRESULT hr = pD3d9->CreateDevice(<br />D3DADAPTER_DEFAULT,<br />D3DDEVTYPE_HAL,<br />hWnd,<br />dwBF,<br />&gD3Dpp,<br />&pD3dDevice9);<br />if (FAILED(hr))<br />{<br />return hr;<br />}</p><p>D3DXCreateTextureFromFileEx(pD3dDevice9,<br />L"B.jpg",<br />D3DX_DEFAULT,<br />D3DX_DEFAULT,<br />D3DX_DEFAULT,<br />0,<br />D3DFMT_UNKNOWN,<br />D3DPOOL_MANAGED,<br />D3DX_DEFAULT,<br />D3DX_DEFAULT,<br />0,<br />NULL,<br />NULL,<br />&pTexture1.p);</p><p>D3DXCreateTextureFromFileEx(pD3dDevice9,<br />L"A.jpg",<br />D3DX_DEFAULT,<br />D3DX_DEFAULT,<br />D3DX_DEFAULT,<br />0,<br />D3DFMT_UNKNOWN,<br />D3DPOOL_MANAGED,<br />D3DX_DEFAULT,<br />D3DX_DEFAULT,<br />0,<br />NULL,<br />NULL,<br />&pTexture2.p);</p><p>return S_OK;<br />}
3.渲染圖片DrawTexture()函數:
HRESULT DrawTexture(IDirect3DTexture9* pTexture, float fLeft, float fTop, float fRight, float fBottom, D3DCOLOR clr)<br />{<br />pD3dDevice9->BeginScene();</p><p>pD3dDevice9->SetTexture(0,pTexture);<br />pD3dDevice9->SetFVF(D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX1);</p><p>struct<br />{<br />float x, y, z, rhw;<br />D3DCOLOR clr;<br />float tu, tv;<br />} pVertices[4];</p><p>pVertices[0].x= fLeft;<br />pVertices[0].y= fBottom;<br />pVertices[0].z= 1.f;<br />pVertices[0].rhw= 1.f;<br />pVertices[0].clr= clr;<br />pVertices[0].tu= 0.f;<br />pVertices[0].tv= 1.f;</p><p>pVertices[1].x= fLeft;<br />pVertices[1].y= fTop;<br />pVertices[1].z= 1.f;<br />pVertices[1].rhw= 1.f;<br />pVertices[1].clr= clr;<br />pVertices[1].tu= 0.f;<br />pVertices[1].tv= 0.f;</p><p>pVertices[2].x= fRight;<br />pVertices[2].y= fBottom;<br />pVertices[2].z= 1.f;<br />pVertices[2].rhw= 1.f;<br />pVertices[2].clr= clr;<br />pVertices[2].tu= 1.f;<br />pVertices[2].tv= 1.f;</p><p>pVertices[3].x= fRight;<br />pVertices[3].y= fTop;<br />pVertices[3].z= 1.f;<br />pVertices[3].rhw= 1.f;<br />pVertices[3].clr= clr;<br />pVertices[3].tu= 1.f;<br />pVertices[3].tv= 0.f;</p><p>pD3dDevice9->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, pVertices, sizeof(pVertices[0]));</p><p>pD3dDevice9->EndScene();</p><p>return S_OK;<br />}
4.設定屬性狀態SetState()函數:
void SetState()<br />{<br />pD3dDevice9->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);<br />pD3dDevice9->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);<br />pD3dDevice9->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);<br />pD3dDevice9->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);<br />pD3dDevice9->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE);<br />}<br />
5.顯示Present()函數:
HRESULT Present()<br />{<br />SetState();<br />DrawTexture(pTexture1.p,300,40,567,440,0xFFFFFFFF);<br />DrawTexture(pTexture2.p,400,20,667,420,0xA0FFFFFF);<br />pD3dDevice9->Present(NULL,NULL,NULL,NULL);<br />return S_OK;<br />}
6.處理訊息:在WM_CREATE訊息中調用Create(hWnd); 在WM_PAINT訊息的BeginPaint(hWnd, &ps)和EndPaint(hWnd, &ps)中間調用Present();
說明:
1.按照由遠及近的順序渲染;
2.通過設定rhw值的高8位來處理透明度,即0x**FFFFFF中的**位,00表示完全透明,FF表示不透明,中間的值是半透明。
工程:http://download.csdn.net/source/3318014