В настоящее время у меня есть элемент управления activex, который запускает среду мультимедиа (видео / аудио), разработанную другой группой разработчиков в моей компании, и я предоставляю дескриптор окна для этого кода. Этот дескриптор используется их плагином рендеринга в конвейере, который использует Direct3d для рендеринга видео с использованием этого дескриптора.
У меня есть отдельные указатели LPDIRECT3D9EX и LPDIRECT3DDEVICE9EX, которые я инициализирую в моем элементе управления activex. Я пытаюсь очистить задний буфер до прозрачного, а затем использовать примитивы рисования directx, чтобы рисовать в этом буфере, создавая прозрачное окно с моими примитивами рисования поверх потокового видео на поверхности directx ниже.
Похоже, что очистка обратного буфера устройства с полной альфа-прозрачностью игнорируется DirectX.
d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_RGBA(0, 0, 1, 0 /*full alpha*/), 1.0f, 0);
Я вижу объект, который рисую, но они нарисованы поверх заднего буфера, для которого указан цвет RGB без значения альфа. Связанный проект (http://www.codeproject.com/KB/directx/umvistad3d.aspx) в вопросе stackoverflow ниже делает то, что я хочу, но требует диспетчера окон рабочего стола Vista и не будет работать для XP.
Как нарисовать прозрачное содержимое DirectX в прозрачном окно?
- Я пробовал с D3DRS_ALPHABLENDENABLE true с настроенной смесью, но безрезультатно.
- Я также пытался иметь пиксели с полными альфа-значениями, которые не отображались с использованием настроек D3DRS_ALPHATESTENABLE, D3DRS_ALPHAREF и D3DRS_ALPHAFUNC, но это тоже не работает.
- Я пробовал использовать ColorFill с альфа-каналом после получения обратного буфера с помощью GetBackBuffer, но это тоже не сработало. (снова используется только RGB)
- Наконец, я попытался создать текстуру, выбрать поверхность, заполнить эту поверхность полностью прозрачным альфа-значением, а затем загрузить эту поверхность в задний буфер, но, похоже, используются только значения RGB.
Я проверил возможности, используя DXCapsViewer.exe, и формат резервного буфера D3DFMT_A8R8G8B8, который я использую для резервного буфера, действителен, поэтому этого не может быть.
У кого-нибудь получился прозрачный бэкбуфер в directx для работы в XP?