DirectShow IVideoWindow и полноэкранный режим — можно ли писать на основную поверхность D3D?

Пишу игру, и я бы хотел несколько роликов в середине. В оконном режиме классы DirectShow прекрасно работают и просты в использовании. Но когда игра в полноэкранном режиме, я не могу заставить DirectShow показывать полноэкранный ролик.

По сути, когда у меня инициализировано устройство D3D, я не могу отобразить видео даже с IVideoWindow.put_Fullscreen(true). Я предполагаю, что DirectShow просто не может работать в полноэкранном режиме с устройством D3D.

Итак, я попытался освободить свое D3D-устройство во время воспроизведения кат-сцены и повторно инициализировать его после этого. Кажется, это работает довольно хорошо, но когда DirectShow воспроизводится в полноэкранном режиме, кажется, что он крадет фокус из главного окна моего приложения и не возвращает его после завершения. Затем это приводит к тому, что DirectInput не может снова получить устройство (дает мне код ошибки «Отказано в доступе»). Я попробовал SetForegroundWindow() перед приобретением, но это не решает проблему, так что проблема может быть и не в этом.

Короче говоря, все, что я хочу, это полноэкранный ролик в середине моего приложения D3D. Есть ли предпочтительный способ сделать это? Могу ли я сделать это, настроив вывод DirectShow на основную поверхность D3D? Думаю, это решит те проблемы, которые у меня есть.


person TrespassersW    schedule 06.12.2009    source источник


Ответы (2)


Вы хотите создать собственный распределитель для Video Mixing Renderer 9. Это намного проще, чем создание собственного фильтра рендерера, и он специально создан для взаимодействия с D3D.

Пример есть в Windows SDK. Мой установлен здесь:

C:\Program Files\Microsoft SDK\Windows\v7.0\Samples\multimedia\directshow\vmr9\vmr9allocator

person Jeremiah Morrill    schedule 07.12.2009
comment
Мне потребовалось некоторое время, но я нашел пример, на который вы ссылаетесь (он был в Windows SDK, но не в DirectX SDK - как странно). Я посмотрю на это сегодня вечером и посмотрю, смогу ли я понять это. Похоже на то, что я ищу. - person TrespassersW; 08.12.2009
comment
DirectShow (несмотря на название) был перемещен в Windows SDK 5 или 6 лет назад. Меня это тоже смутило, когда я впервые узнал об этом. В любом случае, преимущества использования распределителя VMR9 заключаются в том, что вы можете получить аппаратное ускорение видео с определенными форматами, аппаратное ускорение преобразования цветового пространства и деинтерлейсинг... не говоря уже о том, что это помогает вам выполнять рендеринг на поверхность d3d;) - person Jeremiah Morrill; 08.12.2009
comment
Просто подумал, что я вернусь и упомяну, что у меня это работает, благодаря образцу, на который вы мне указали. Еще раз спасибо. - person TrespassersW; 11.12.2009

Посмотрите на "DumpFilter". Используя это, вы можете ЛЕГКО написать фильтр, который будет записывать непосредственно в текстуру D3D. Кроме того, имейте в виду, что вам не нужно поддерживать создание внешнего экземпляра com. Вы можете просто создать экземпляр класса и использовать его. Его не нужно выставлять за пределы вашего приложения...

Редактировать: DumpFilter является одним из примеров API DirectShow.

person Goz    schedule 06.12.2009
comment
Я не вижу DumpFilter в моем файле API DirectShow. Я использую DX9. Это случайно не DX10? - person TrespassersW; 07.12.2009