#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
классом.