无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 486|回复: 7
打印 上一主题 下一主题

[求助] 求助:DX 9.0 透明背景效果

[复制链接]
跳转到指定楼层
1#
发表于 2024-10-26 16:31:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
DX 9.0 需实现多层位图背景


用“表面”类型,可以显示位图。无法实现透明效果。
LPDIRECT3DSURFACE9   image = NULL
D3DXLoadSurfaceFromFile( image , …… )
d3ddev->StretchRect()

想改用“纹理”类型(支持透明),介绍的都是“纹理+精灵”方式。
LPDIRECT3DTEXTURE9  image = NULL
D3DXCreateTextureFromFileEx( ...  pic.jpg  ...  &image )
LPD3DXSPRITE  background = NULL
D3DXCreateSprite(d3ddev, &background)
background->Draw(image , ...   D3DCOLOR_XRGB(0, 0, 0)

代码过于冗长。
有没有不用精灵,单用纹理的绘图方式?就像表面类型那样,用纹理直接绘图。


2#
发表于 2024-10-26 22:51:56 | 只看该作者
类似于这?
  1. #include <d3d9.h>
  2. #include <d3dx9.h>

  3. // 全局变量
  4. LPDIRECT3D9             g_pD3D = NULL;
  5. LPDIRECT3DDEVICE9       g_pd3dDevice = NULL;
  6. LPDIRECT3DVERTEXBUFFER9 g_pVB = NULL;
  7. LPDIRECT3DTEXTURE9      g_pTexture = NULL;

  8. struct CUSTOMVERTEX {
  9.     FLOAT x, y, z, rhw; // 位置
  10.     FLOAT tu, tv;       // 纹理坐标
  11. };

  12. #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW | D3DFVF_TEX1)

  13. // 初始化 Direct3D
  14. HRESULT InitD3D(HWND hWnd) {
  15.     if ((g_pD3D = Direct3DCreate9(D3D_SDK_VERSION)) == NULL)
  16.         return E_FAIL;

  17.     D3DPRESENT_PARAMETERS d3dpp;
  18.     ZeroMemory(&d3dpp, sizeof(d3dpp));
  19.     d3dpp.Windowed = TRUE;
  20.     d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
  21.     d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;

  22.     if (FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
  23.                                     D3DCREATE_SOFTWARE_VERTEXPROCESSING,
  24.                                     &d3dpp, &g_pd3dDevice))) {
  25.         return E_FAIL;
  26.     }

  27.     return S_OK;
  28. }

  29. // 初始化顶点缓冲区
  30. HRESULT InitVertexBuffer() {
  31.     if (FAILED(g_pd3dDevice->CreateVertexBuffer(4 * sizeof(CUSTOMVERTEX),
  32.                                                 0, D3DFVF_CUSTOMVERTEX,
  33.                                                 D3DPOOL_MANAGED, &g_pVB, NULL))) {
  34.         return E_FAIL;
  35.     }

  36.     CUSTOMVERTEX* pVertices;
  37.     if (FAILED(g_pVB->Lock(0, sizeof(CUSTOMVERTEX) * 4, (void**)&pVertices, 0)))
  38.         return E_FAIL;

  39.     pVertices[0].x = 0.0f; pVertices[0].y = 0.0f; pVertices[0].z = 0.5f; pVertices[0].rhw = 1.0f; pVertices[0].tu = 0.0f; pVertices[0].tv = 0.0f;
  40.     pVertices[1].x = 800.0f; pVertices[1].y = 0.0f; pVertices[1].z = 0.5f; pVertices[1].rhw = 1.0f; pVertices[1].tu = 1.0f; pVertices[1].tv = 0.0f;
  41.     pVertices[2].x = 0.0f; pVertices[2].y = 600.0f; pVertices[2].z = 0.5f; pVertices[2].rhw = 1.0f; pVertices[2].tu = 0.0f; pVertices[2].tv = 1.0f;
  42.     pVertices[3].x = 800.0f; pVertices[3].y = 600.0f; pVertices[3].z = 0.5f; pVertices[3].rhw = 1.0f; pVertices[3].tu = 1.0f; pVertices[3].tv = 1.0f;

  43.     g_pVB->Unlock();

  44.     return S_OK;
  45. }

  46. // 加载纹理
  47. HRESULT LoadTexture() {
  48.     if (FAILED(D3DXCreateTextureFromFileEx(g_pd3dDevice, "pic.png",
  49.                                            D3DX_DEFAULT, D3DX_DEFAULT, D3DX_DEFAULT, 0,
  50.                                            D3DFMT_A8R8G8B8, D3DPOOL_MANAGED,
  51.                                            D3DX_DEFAULT, D3DX_DEFAULT, 0,
  52.                                            NULL, NULL, &g_pTexture))) {
  53.         return E_FAIL;
  54.     }

  55.     return S_OK;
  56. }

  57. // 渲染场景
  58. void Render() {
  59.     if (NULL == g_pd3dDevice)
  60.         return;

  61.     g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);

  62.     if (SUCCEEDED(g_pd3dDevice->BeginScene())) {
  63.         // 启用 alpha 混合
  64.         g_pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
  65.         g_pd3dDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
  66.         g_pd3dDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);

  67.         // 设置顶点格式
  68.         g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEX);

  69.         // 设置纹理
  70.         g_pd3dDevice->SetTexture(0, g_pTexture);

  71.         // 设置顶点缓冲区
  72.         g_pd3dDevice->SetStreamSource(0, g_pVB, 0, sizeof(CUSTOMVERTEX));

  73.         // 绘制矩形
  74.         g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2);

  75.         // 关闭 alpha 混合(如果不需要后续绘制继续使用)
  76.         g_pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE);

  77.         g_pd3dDevice->EndScene();
  78.     }

  79.     g_pd3dDevice->Present(NULL, NULL, NULL, NULL);
  80. }

  81. // 清理 Direct3D 和 COM
  82. void Cleanup() {
  83.     if (g_pTexture != NULL)
  84.         g_pTexture->Release();

  85.     if (g_pVB != NULL)
  86.         g_pVB->Release();

  87.     if (g_pd3dDevice != NULL)
  88.         g_pd3dDevice->Release();

  89.     if (g_pD3D != NULL)
  90.         g_pD3D->Release();
  91. }

  92. // 窗口过程
  93. LRESULT WINAPI MsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) {
  94.     switch (msg) {
  95.     case WM_DESTROY:
  96.         Cleanup();
  97.         PostQuitMessage(0);
  98.         return 0;
  99.     }

  100.     return DefWindowProc(hWnd, msg, wParam, lParam);
  101. }

  102. // WinMain
  103. INT WINAPI wWinMain(HINSTANCE hInst, HINSTANCE, LPWSTR, INT) {
  104.     WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L, GetModuleHandle(NULL), NULL, NULL, NULL, NULL, L"D3D Tutorial", NULL };
  105.     RegisterClassEx(&wc);

  106.     HWND hWnd = CreateWindow(L"D3D Tutorial", L"D3D Tutorial 01: CreateDevice",
  107.                              WS_OVERLAPPEDWINDOW, 100, 100, 800, 600,
  108.                              NULL, NULL, wc.hInstance, NULL);

  109.     if (SUCCEEDED(InitD3D(hWnd))) {
  110.         if (SUCCEEDED(InitVertexBuffer()) && SUCCEEDED(LoadTexture())) {
  111.             ShowWindow(hWnd, SW_SHOWDEFAULT);
  112.             UpdateWindow(hWnd);

  113.             MSG msg;
  114.             ZeroMemory(&msg, sizeof(msg));
  115.             while (msg.message != WM_QUIT) {
  116.                 if (PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE)) {
  117.                     TranslateMessage(&msg);
  118.                     DispatchMessage(&msg);
  119.                 } else {
  120.                     Render();
  121.                 }
  122.             }
  123.         }
  124.     }

  125.     UnregisterClass(L"D3D Tutorial", wc.hInstance);
  126.     return 0;
  127. }
复制代码

点评

+10  发表于 2024-10-28 07:46
感谢! 看来并不简单,我还是用 纹理+精灵 吧。  详情 回复 发表于 2024-10-28 07:45
回复

使用道具 举报

3#
发表于 2024-10-27 17:50:02 | 只看该作者
赞赞
回复

使用道具 举报

4#
 楼主| 发表于 2024-10-28 07:45:48 | 只看该作者

感谢!

看来并不简单,我还是用 纹理+精灵 吧。
回复

使用道具 举报

5#
发表于 2024-10-28 07:51:24 | 只看该作者

感谢楼主无私分享
回复

使用道具 举报

6#
发表于 2024-10-30 13:29:09 | 只看该作者
学习
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-11-22 14:17

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表