Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Звук, графика и видео > Direct3D9 + DirectShow


Автор: Kesh 23.5.2006, 15:20
Всем здрям...

Вот возник такой вопрос... Пишу приложение, работающее с Direct3D9 но только в 2D... Т.е. использую полигоны, как спрайты...
Не пинайте ногами, мне так удобнее...

Так вот возник вопросец... Мне нужно, чтобы все спрацты располагались поверх фонового спрайта, а на фоновом спрайте в качестве текстуры проигрывался видеофайл...
Видео очень хочется получать из DirectShow, ибо он проигрывает гораздо больше, чем просто VFW...

Работать я хочу все это заставить так... Приложение работает само по себе... А в это время, в отдельном потоке средствами DirectShow готовятся текстуры для фонового спрайта, и по мере готовности подгружаются в основной цикл рендеринга...

Подскажите, может кто знает, как это реализовать - загонять изображения, полученные DirectShow в Direct3DTexture9...

Заранее спасибо... 

Автор: p0s0l 23.5.2006, 16:00
http://www.clootie.ru/delphi/download_custom.html
Мотай там в самый низ ("DirectShow examples")

На компе видяха допотопная, проверить не смог, но судя по описанию там есть, то что тебе нужно:
Цитата(readme.txt)

 *-----------------------------------------------------------------------------*
 *  This sample is modified Texture3D sample from DirectX8 SDK, what uses      *
 *  DirectShow for playing AVI and Direct3D8 for displaying it simultaneusly.  *
 *  DMO filter model used in DirectShow part of example. So example shows how  *
 *  to use helper class from DMOimpl (included in DirectShow.pas) in Delphi.   *
 *  Note: DMO - DirectX Media Objects                                          *
 *                                                                             *
 *  Also this sample shows how to use destination alpha to create transition   *
 *  effects what can be encoded in alpha-layer of image                        *
 *  (plasma.dds image is copyrighted by ATi technologies)                      *
 *-----------------------------------------------------------------------------*

 

Автор: Kesh 23.5.2006, 22:34
p0s0l, а разобраться поможешь?.. smile 

Автор: p0s0l 24.5.2006, 17:44
Цитата(Kesh @  23.5.2006,  22:34 Найти цитируемый пост)
p0s0l, а разобраться поможешь?..  
Не знаю smile, наворочено там как-то...
Я в DirectShow пробовал только самые азы... Для начала я бы сделал так:
Source -> Splitter -> Decoder -> SampleGrabber -> NullRenderer

В SampleGrabber'е получаешь распакованную картинку, ее нужно загнать в текстуру (по ходу дела копированием области памяти, только форматы должны совпадать... может как-то можно автоматом в текстуру загонять ? было бы круто...)...

Цитата(Kesh @  23.5.2006,  15:20 Найти цитируемый пост)
Приложение работает само по себе... А в это время, в отдельном потоке средствами DirectShow готовятся текстуры для фонового спрайта, и по мере готовности подгружаются в основной цикл рендеринга...
Так и получится, насколько я знаю, DirectShow создает отдельные потоки для каждого графа и фильтра. Когда очередной кадр будет готов, SampleGrabber вызовет Callback-функцию, в который ты получешь распакованный кадр...

Еще вариант - написать свой фильтр, который бы стоял сразу после Decoder'а (т.е. NullRenderer и SampleGrabber уже не нужны), и при получении данных загонял их в Direct3D-текстуру... Может уже есть такой фильтр ?... 

Автор: Kesh 24.5.2006, 18:46
Цитата(p0s0l @  24.5.2006,  17:44 Найти цитируемый пост)
Не знаю smile, наворочено там как-то...

Да вот и я про то же...
 

Автор: p0s0l 28.5.2006, 20:17
Кстати, VMR9 может рендерить в IDirect3DSurface9... Можно задать одинаковые форматы сурфейса (через IVMRSurfaceAllocatorNotify9) и твоей текстуры, потом через LockRect перекидивать данные из сурфейса в 0-й уровень текстуры...
Но интереснее следующее - судя по MSDN, для VMR9 можно задать свой собственный (Application-defined) Surface Allocator... Тогда в Allocator'е можно было бы создать D3D9-текстуру, получить у нее GetSurfaceLevel(0). После этого теоретически VMR9 должно рендерить в этот сурфейс... Правда теоретически smile, по почему бы не попробовать ?...

Вобщем, советую порыть в направлении фильтра Video Mixing Renderer 9...
 

Автор: Kesh 29.5.2006, 13:05
p0s0l, сдается мне, что в демках DSPack так и делается... smile
Ладно... буду рыть дальше... Пока что-то не особо получается... 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)