Альфа-значение D3DCOLOR не влияет на заполнение цветом и завязку в DirectX9

#c #directx-9

Вопрос:

Я хочу рисовать цветные квадратики, а также строки для отображения в определенных случаях. Иногда лучше смотрится, если нарисованный прямоугольник прозрачен. Однако, когда я рисую прямоугольник, значение альфа, похоже, игнорируется DirectX 9.

Например, это мой метод DrawFilledBox и DrawString:

 bool DrawString(const d3dfont_s* pFont, const std::wstringamp; wszText, int x, int y, BYTE r, BYTE g, BYTE b, BYTE a)
        {
            //Draw a string on backbuffer

            if ((!this->m_pDevice) || (!wszText.length()) || (!pFont))
                return false;

            //End drawing sprites
            if (FAILED(this->m_pSpriteMgr->End()))
                return false;

            //Set data
            RECT rect = { x, y, x, y };
            D3DCOLOR d3dcColor = D3DCOLOR_ARGB(a, r, g, b);

            //Calculate font rect
            INT iResult = pFont->pFont->DrawText(nullptr, wszText.c_str(), (int)wszText.length(), amp;rect, DT_NOCLIP, d3dcColor);

            //Begin drawing sprites
            if (FAILED(this->m_pSpriteMgr->Begin(D3DXSPRITE_ALPHABLEND)))
                return false;

            return iResult != 0;
        }

bool DrawFilledBox(int x, int y, int w, int h, BYTE r, BYTE g, BYTE b, BYTE a)
        {
            //Draw a filled box on backbuffer

            if (!this->m_pDevice)
                return false;

            IDirect3DSurface9* pSurface = nullptr;

            //End drawing sprites
            if (FAILED(this->m_pSpriteMgr->End()))
                return false;

            //Create surface
            if (FAILED(this->m_pDevice->CreateOffscreenPlainSurface(w, h, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, amp;pSurface, nullptr)))
                return false;

            //Fill surface with color
            if (FAILED(this->m_pDevice->ColorFill(pSurface, nullptr, D3DCOLOR_ARGB(a, r, g, b)))) {
                pSurface->Release();
                return false;
            }

            //Set destination area
            RECT rTargetRect;
            rTargetRect.left = x;
            rTargetRect.top = y;
            rTargetRect.right = x   w;
            rTargetRect.bottom = y   h;

            //Copy surface into backbuffer at desired position
            bool bResult = SUCCEEDED(this->m_pDevice->StretchRect(pSurface, nullptr, this->m_pBackBuffer, amp;rTargetRect, D3DTEXF_NONE));

            //Release surface
            pSurface->Release();

            //Begin drawing sprites
            if (FAILED(this->m_pSpriteMgr->Begin(D3DXSPRITE_ALPHABLEND)))
                return false;

            return bResu<
        }
 

Как вы можете видеть, я предоставляю альфа-значение, используя макрос D3DCOLOR_ARGB. Однако альфа, похоже, просто игнорируется.

Я гуглил часами, но, по-видимому, ни у кого раньше не было такой проблемы, я не могу найти ни одной темы об этом.

Что я делаю не так?

Комментарии:

1. Лучший способ нарисовать «заполненный треугольник» в Direct3D, вероятно, использовать белую текстуру 1×1 и просто нарисовать ее как спрайт 🙂

2. Кстати, Direct3D 9 является устаревшим и чрезвычайно старым, с ограниченной поддержкой современных утилит и отсутствием поддержки отладки в Windows 8 или более поздней версии. Если вы новичок в Direct3D, посмотрите на использование DirectX 11. Вместо использования старого устаревшего DirectX SDK или D3DX , ознакомьтесь с Набором инструментов DirectX и его SpriteBatch классом.