织梦CMS - 轻松建站从此开始!

罗索

Direct3D 半透明渲染

落鹤生 发布于 2012-02-28 11:34 点击:次 
利用Direct3D实现图片A半透明渲染到图片B上面。1.按照由远及近的顺序渲染;2.通过设置rhw值的高8位来处理透明度,即0x**FFFFFF中的**位,00表示完全透明,FF表示不透明,中间的值是半透明。
TAG:

目的:

利用Direct3D实现图片A半透明渲染到图片B上面。

步骤:

1.创建标准WIN32程序,添加需要用到的对象定义和函数声明:

  1. CComPtr<IDirect3D9> pD3d9; 
  2. CComPtr<IDirect3DDevice9> pD3dDevice9; 
  3. CComPtr<IDirect3DTexture9> pTexture1; 
  4. CComPtr<IDirect3DTexture9> pTexture2; 
  5. D3DPRESENT_PARAMETERS gD3Dpp; 
  6.  
  7. HRESULT Create(HWND hWnd); 
  8. HRESULT DrawTexture(IDirect3DTexture9* pTexture,  
  9.     float fLeft, float fTop, float fRight, float fBottom, D3DCOLOR clr); 
  10. void SetState(); 
  11. HRESULT Present(); 

2.创建需要的对象,即实现Create(HWND hWnd)函数:

  1. HRESULT Create(HWND hWnd) 
  2.     pD3d9 = Direct3DCreate9(D3D_SDK_VERSION); 
  3.     if (pD3d9 == NULL) 
  4.     { 
  5.         return S_FALSE; 
  6.     } 
  7.  
  8.     D3DCAPS9 caps; 
  9.     pD3d9->GetDeviceCaps(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,&caps); 
  10.     DWORD dwBF; 
  11.     if (caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT) 
  12.     { 
  13.         dwBF = D3DCREATE_HARDWARE_VERTEXPROCESSING; 
  14.     } 
  15.     else 
  16.     { 
  17.         dwBF = D3DCREATE_SOFTWARE_VERTEXPROCESSING; 
  18.     } 
  19.     if (caps.DevCaps & D3DDEVCAPS_PUREDEVICE) 
  20.     { 
  21.         dwBF |= D3DCREATE_PUREDEVICE; 
  22.     } 
  23.  
  24.     D3DDISPLAYMODE d3ddm; 
  25.     pD3d9->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&d3ddm); 
  26.     gD3Dpp.BackBufferCount = 1; 
  27.     gD3Dpp.Windowed = TRUE; 
  28.     gD3Dpp.hDeviceWindow = hWnd; 
  29.     gD3Dpp.SwapEffect = D3DSWAPEFFECT_COPY; 
  30.     gD3Dpp.BackBufferFormat = d3ddm.Format; 
  31.  
  32.     HRESULT hr = pD3d9->CreateDevice( 
  33.         D3DADAPTER_DEFAULT, 
  34.         D3DDEVTYPE_HAL, 
  35.         hWnd, 
  36.         dwBF, 
  37.         &gD3Dpp, 
  38.         &pD3dDevice9); 
  39.     if (FAILED(hr)) 
  40.     { 
  41.         return hr; 
  42.     } 
  43.  
  44.     D3DXCreateTextureFromFileEx(pD3dDevice9, 
  45.         L"B.jpg"
  46.         D3DX_DEFAULT, 
  47.         D3DX_DEFAULT, 
  48.         D3DX_DEFAULT, 
  49.         0, 
  50.         D3DFMT_UNKNOWN, 
  51.         D3DPOOL_MANAGED, 
  52.         D3DX_DEFAULT, 
  53.         D3DX_DEFAULT, 
  54.         0, 
  55.         NULL, 
  56.         NULL, 
  57.         &pTexture1.p); 
  58.  
  59.     D3DXCreateTextureFromFileEx(pD3dDevice9, 
  60.         L"A.jpg"
  61.         D3DX_DEFAULT, 
  62.         D3DX_DEFAULT, 
  63.         D3DX_DEFAULT, 
  64.         0, 
  65.         D3DFMT_UNKNOWN, 
  66.         D3DPOOL_MANAGED, 
  67.         D3DX_DEFAULT, 
  68.         D3DX_DEFAULT, 
  69.         0, 
  70.         NULL, 
  71.         NULL, 
  72.         &pTexture2.p); 
  73.  
  74.     return S_OK; 

3.渲染图片DrawTexture()函数:

  1. HRESULT DrawTexture(IDirect3DTexture9* pTexture, float fLeft, float fTop
  2. float fRight, float fBottom, D3DCOLOR clr) 
  3.     pD3dDevice9->BeginScene(); 
  4.  
  5.     pD3dDevice9->SetTexture(0,pTexture); 
  6.     pD3dDevice9->SetFVF(D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX1); 
  7.  
  8.     struct  
  9.     { 
  10.         float x, y, z, rhw; 
  11.         D3DCOLOR clr; 
  12.         float tu, tv; 
  13.     } pVertices[4]; 
  14.  
  15.     pVertices[0].x      = fLeft; 
  16.     pVertices[0].y      = fBottom; 
  17.     pVertices[0].z      = 1.f; 
  18.     pVertices[0].rhw    = 1.f; 
  19.     pVertices[0].clr    = clr; 
  20.     pVertices[0].tu = 0.f; 
  21.     pVertices[0].tv = 1.f; 
  22.  
  23.     pVertices[1].x      = fLeft; 
  24.     pVertices[1].y      = fTop; 
  25.     pVertices[1].z      = 1.f; 
  26.     pVertices[1].rhw    = 1.f; 
  27.     pVertices[1].clr    = clr; 
  28.     pVertices[1].tu = 0.f; 
  29.     pVertices[1].tv = 0.f; 
  30.  
  31.     pVertices[2].x      = fRight; 
  32.     pVertices[2].y      = fBottom; 
  33.     pVertices[2].z      = 1.f; 
  34.     pVertices[2].rhw    = 1.f; 
  35.     pVertices[2].clr    = clr; 
  36.     pVertices[2].tu = 1.f; 
  37.     pVertices[2].tv = 1.f; 
  38.  
  39.     pVertices[3].x      = fRight; 
  40.     pVertices[3].y      = fTop; 
  41.     pVertices[3].z      = 1.f; 
  42.     pVertices[3].rhw    = 1.f; 
  43.     pVertices[3].clr    = clr; 
  44.     pVertices[3].tu = 1.f; 
  45.     pVertices[3].tv = 0.f; 
  46.  
  47.     pD3dDevice9->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, pVertices, sizeof(pVertices[0])); 
  48.  
  49.     pD3dDevice9->EndScene(); 
  50.  
  51.     return S_OK; 

4.设置属性状态SetState()函数:

  1. void SetState() 
  2.     pD3dDevice9->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); 
  3.     pD3dDevice9->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); 
  4.     pD3dDevice9->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); 
  5.     pD3dDevice9->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE); 
  6.     pD3dDevice9->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE); 

5.显示Present()函数:

  1. HRESULT Present() 
  2.     SetState(); 
  3.     DrawTexture(pTexture1.p,300,40,567,440,0xFFFFFFFF); 
  4.     DrawTexture(pTexture2.p,400,20,667,420,0xA0FFFFFF); 
  5.     pD3dDevice9->Present(NULL,NULL,NULL,NULL); 
  6.     return S_OK; 

6.处理消息:在WM_CREATE消息中调用Create(hWnd);  在WM_PAINT消息的BeginPaint(hWnd, &ps)和EndPaint(hWnd, &ps)中间调用Present();

说明:

1.按照由远及近的顺序渲染;

2.通过设置rhw值的高8位来处理透明度,即0x**FFFFFF中的**位,00表示完全透明,FF表示不透明,中间的值是半透明。

完整源码下载http://bbs.rosoo.net/thread-13376-1-1.html

(bwmwm)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201202/15767.html]
本文出处:CSDN博客 作者:bwmwm 原文
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容