【问题标题】:C++ D3D9 Alpha Blending with Creators UpdateC++ D3D9 Alpha 混合与创作者更新
【发布时间】:2017-04-27 01:15:15
【问题描述】:

目前我正在开发一个使用 dx9 创建覆盖的应用程序。 现在我遇到了一个问题,因为我将 Windows 10 升级到了最新版本(Creators Update),所以它无法使用 alpha 通道 例如。如果我尝试渲染透明矩形,它始终保持 100% 可见

设置

WNDCLASSEX wc = {
    sizeof(WNDCLASSEX),
    0,
    WndProc,
    0,
    0,
    nullptr,
    LoadIcon(nullptr, IDI_APPLICATION),
    LoadCursor(nullptr, IDC_ARROW),
    nullptr,
    nullptr,
    OverlayName.c_str(),
    LoadIcon(nullptr, IDI_APPLICATION)
};

if (!RegisterClassEx(&wc))
    return false;

m_hWndOverlay = CreateWindowEx(WS_EX_TOPMOST | WS_EX_TRANSPARENT | WS_EX_LAYERED,
    OverlayName.c_str(),
    OverlayName.c_str(),
    WS_POPUP, CW_USEDEFAULT, CW_USEDEFAULT, 800, 600, nullptr, nullptr, nullptr, nullptr);

if (!m_hWndOverlay)
    return false;

if (!SetLayeredWindowAttributes(m_hWndOverlay, RGB(NULL, NULL, NULL), 255, ULW_COLORKEY | LWA_ALPHA))
    return false;

static MARGINS  DWMMargins = { -1, -1, -1, -1 };
if (!HR(DwmExtendFrameIntoClientArea(m_hWndOverlay, &DWMMargins), "DwmExtendFrameIntoClientArea()"))
    return false;

ShowWindow(m_hWndOverlay, SW_SHOWDEFAULT);
if (!UpdateWindow(m_hWndOverlay))
    return false;

if (!HR(Direct3DCreate9Ex(D3D_SDK_VERSION, &m_pDirect3D9Ex),        "Direct3DCreate9Ex()"))
    return false;

D3DPRESENT_PARAMETERS params;
ZeroMemory(&params, sizeof(D3DPRESENT_PARAMETERS));

params.Windowed = TRUE;
params.SwapEffect = D3DSWAPEFFECT_DISCARD;
params.BackBufferFormat = D3DFMT_A8R8G8B8;
params.EnableAutoDepthStencil = TRUE;
params.AutoDepthStencilFormat = D3DFMT_D16;
params.MultiSampleType = D3DMULTISAMPLE_NONE;
params.PresentationInterval = 0x80000000L;
DWORD dwMSQAAQuality = 0;

if (HR(m_pDirect3D9Ex->CheckDeviceMultiSampleType(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, D3DFMT_A8R8G8B8, true, D3DMULTISAMPLE_NONMASKABLE, &dwMSQAAQuality), "CheckDeviceMultiSampleType()"))
{
    params.MultiSampleType = D3DMULTISAMPLE_NONMASKABLE;
    params.MultiSampleQuality = dwMSQAAQuality - 1;
}

if (!HR(m_pDirect3D9Ex->CreateDeviceEx(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, m_hWndOverlay, D3DCREATE_HARDWARE_VERTEXPROCESSING, &params, nullptr, &m_pDirect3D9Device), "CreateDeviceEx()"))
    return false;

渲染方法

void DrawFilledRect(float x, float y, float w, float h, DWORD color) const
{
VERTEX_2D_DIF V[4];

V[0].color = V[1].color = V[2].color = V[3].color = color;

V[0].z = V[1].z = V[2].z = V[3].z = 0;
V[0].rhw = V[1].rhw = V[2].rhw = V[3].rhw = 1;

V[0].x = x;
V[0].y = y;
V[1].x = x + w;
V[1].y = y;
V[2].x = x + w;
V[2].y = y + h;
V[3].x = x;
V[3].y = y + h;

m_pDirect3D9Device->SetFVF(VERTEX_2D_DIF::FVF);
m_pDirect3D9Device->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, &V, sizeof(VERTEX_2D_DIF));
}

函数调用

DrawFilledRect(25.f, 25.f, 25.f, 25.f, 0x10FFFFFF);

有什么建议吗?在更新之前它运行良好...

【问题讨论】:

  • 如果禁用 MSAA 会起作用吗?
  • 也许将CS_PARENTDC 设置为窗口类样式和/或不设置颜色键会有帮助?
  • 感谢您的建议!不幸的是,它没有用.. 到目前为止,我尝试通过设置 D3DRS_ALPHABLENDENABLE 和 D3DRS_SEPARATEALPHABLENDENABLE 创建一个“较暗”的矩形来稍微弄乱渲染设置。使用颜色键 0x3F00FF00 但仍然没有 alpha 渲染..
  • 哦,我注意到的另一件奇怪的事情是,将颜色键设置为 0xXX000000 会创建一个完全透明的矩形,而不是黑色的。颜色键可能有问题吗?它适用于较旧的 Windows 10 版本

标签: c++ directx


【解决方案1】:

我现在自己找到了解决方案。

我不得不删除 ULW_COLORKEY 选项,该选项旨在使用 crkey 作为透明度颜色。这可能无法与最新的创建者更新一起正常工作。

【讨论】:

  • 感谢分享,今天遇到这个问题,删除 ULW_COLORKEY 解决了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-02
  • 1970-01-01
  • 2017-02-27
  • 1970-01-01
  • 2018-12-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多