Direct3D 半透明渲染

來源:互聯網
上載者:User

目的:

利用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

 

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.