Как получить полностью прозрачный бэкбуфер в DirectX 9 без Vista Desktop Window Manager

В настоящее время у меня есть элемент управления 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?


person flawlesslyfaulted    schedule 07.05.2010    source источник


Ответы (1)


Проблема в том, что ваш задний буфер содержит альфа-значения, а ваш передний буфер ... их нет. Вам нужно будет заблокировать задний буфер и скопировать пиксели в многослойное окно DC. Но будьте осторожны ... это БУДЕТ медленным.

Изменить: в ответ на ваши вопросы в комментарии.

1) Точка альфа-значений в заднем буфере предназначена для альфа-тестирования и смешивания
2) (См. Ответ 1)
3) Нет, я говорю игнорировать передний буфер и получить задний буфер.
4) Какой прямой объект x используется медиа-фреймом? Нет такого. DirectShow! = Direct3D все, что думают 99% людей ...

person Goz    schedule 08.05.2010
comment
Поэтому, когда задний буфер заменяется передним буфером, альфа-значения ничего не делают. Какова точка альфа-значений для заднего буфера? Используется ли он просто в операциях смешивания с примитивами и текстурами, применяемыми к фоновому буферу, когда включено альфа-смешивание? Итак, вы говорите использовать GetFrontBufferData, упомянутый на msdn, как имеющий недостаток в том, что он очень медленный по дизайну и не должен использоваться на любом пути, критичном к производительности? Единственная альтернатива - получить устройство directx, используемое медиа-фреймворком, и использовать его для моих примитивов рисования в моем блоке Beginscene / Endscene? - person flawlesslyfaulted; 11.05.2010
comment
4) Нет, вы неправильно поняли, группа разработчиков разработала собственный медиа-фреймворк и не использует DirectShow. Как я уже сказал в своем вопросе, я предоставляю их фреймворку дескриптор окна, и они создают указатель устройства directx. 3) Какой бэкбуфер? Я уже пробовал получить и использовать резервный буфер моего устройства DirectX, как упоминалось в моих пунктах. Если я попытаюсь использовать резервный буфер, который использует фреймворк, у меня уже будет то, что мне нужно, и я все равно вставлю свой рисунок. Тем не менее, спасибо за информацию ... Это соответствует тому, что я читал на разных форумах. - person flawlesslyfaulted; 11.05.2010