![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Динамической освещение в PowerDraw3/DirectX
Smab © (2005-03-17 17:29:00)Подскажите пожалуйста какой-нибудь способ создания нормального динамического освещения в 2д игре, использую PowerDraw3.
Метод с освещением(установкой цвета в зависимости от света) вершин спрайтов, предложенный тут не подходит. Может кто-нибудь знает дургой способ? Помогите пожалуйста.
Ландграф Павел (2005-03-20 20:40:00) [1]Я PowerInput не использую=)
dRake (2005-03-20 20:24:00) [2]На лови:
http://dopesoft.net/files/MyPD.rar
только учти я там PowerInput еще не успел переделать =)
А по части графики почти все.
Ландграф Павел (2005-03-20 15:08:00) [3]dRake>кинь - посмотрю=)
Cash (2005-03-20 14:01:00) [4]Конечно PD3 мощнее и круче (без Б) но я использую Omega9f
{ http://64.22.203.135/modules/mydownloads/}
там освещение без проблем создается.
(другой факт - немного более тяжелая библиотека и дает меньшие FPS, да я все равно не жадный - ставлю 30 и ничего)
dRake (2005-03-20 13:44:00) [5]Они у меня очень жестко правлены =)
Я там всю структуру перекопал...
Ну если хочешь могу скинуть
Ландграф Павел (2005-03-19 15:40:00) [6]Кинь мне плиз правленые юниты, если не сложно...
dRake (2005-03-18 11:46:00) [7]Все текстуры которые я упоминаю - это TAGFImage.
В принципе этот самый TAGFImage есть ни что иное как небольшая надстройка над IDirect3DTexture9;
Но тут есть одна проблема - чтобы создать текстуру с возможностью рендера в нее необходимо прописать во-первых D3DPOOL_DEFAULT а
во-вторых D3DUSAGE_RENDERTARGET, кроме того полученая текстура не лочится, загружать в нее данные надо другим способом.
Что тебе надо будет сделать:
немного дополнить Create() и Initialize() у TAGFImage, и добавить в описание типа одно свойство, которое будет отвечать за тип текстуры. Конструктор будет выглядеть так Create(TexMode : byte);
В Initialize будет проверяться TexMode и если оно будет например
TM_DEFAULT то будет создана обычная текстура
D3DDev.CreateTexture(TexWidth, TexHeight, 1, 0, TexFormat, D3DPOOL_MANAGED, Texture)
а если TM_RENDERTARGET то с возможностью рендера в нее
D3DDev.CreateTexture(TexWidth, TexHeight, 1, D3DUSAGE_RENDERTARGET, TexFormat, D3DPOOL_DEFAULT, Texture);
Дальше придется переписать метод LoadFromFile()
Если текстура с TM_DEFAULT то пусть грузится, а для текстуры с TM_RENDERTARGET надо написать другой метод.
Алгоритм такой:
1) Создаем промежуточную текстуру обязательно в системной памяти
таких же размеров и с таким же форматом пиксела как и у subj
D3DDev.CreateTexture(TexWidth, TexHeight, 1, 0, TexFormat, D3DPOOL_SYSTEMMEM, Dummy);
2) Забиваем в нее данные так же как и для обычной текстуры
3) Копируем данные из нее в subj
D3DDev.UpdateTexture(Dummy, Image.Texture);
4) Dummy := nil; удаляем текстуру
Если все это у тебя запашет то потом просто
// Запоминаем текущую пов-ть юекбуффера
PD.D3DDev.GetRenderTarget(ScreenSurface);
// Получаем пов-ть с 0 mipmap уровнем из нашей текстуры
Image.Texture.GetSurfaceLevel(0, ImgSurface);
// Устонавливаем отрисовку на полученную пов-ть
PD.D3DDev.SetRenderTarget(ImgSurface, nil);
// Рисуем
PD.BeginScene;
{..........}
PD.EndScene;
// Возвращаем таргет на пов-ть бекбуффера
PD.D3DDev.SetRenderTarget(ScreenSurface, nil);
Smab (2005-03-18 08:44:00) [8]dRake © (17.03.05 23:35) [4]
Все текстуры, которые ты тут упоминаешь - это чистые TAGFImage?
Ты наверное упоминаешь рендер средствами DirectX - SetRednerTarget и т.д.? Если да, то возникает такой вопрос: как потом отрендерить полученную IDirect3DTexture9 текстуру?
>>Короче чтобы было попонятнее нарисую картинку...
Понятно, спасибо=)
dRake (2005-03-17 23:35:00) [9]Ну я объясню алгоритм, если понравится могу и реализацию подсказать....
Создается лайтмап - текстура размером с бэкбуффер.
после завершения всех отрисовок делаем:
1) заливаем лайтмап каким-то цветом (или если есть и статический лайтмап, копируем в нашу текстуру соответствующий кусок статического лайтмапа, вообщем вариантов куча =)
2) рендерим на него все источники света попадающие в экран в соответствующих координатах с effectAdd
3) рендерим лайтмап на бэкбуффер с effectMul
Короче чтобы было попонятнее нарисую картинку...
http://dopesoft.net/img/Light.jpg
Smab (2005-03-17 21:24:00) [10]dRake © (17.03.05 17:52) [1]
Я делал с помощью рендера в текстуру.
Это как?
A22 (2005-03-17 18:03:00) [11]вариантов-то немного. либо цвет вершин менять, либо текстуру освещения накладывать, либо под освещенные участки отдельно геометрию формировать (что-нибудь вроде конуса света от прожектора)
уточни что и как тебе освещать нужно
dRake (2005-03-17 17:52:00) [12]С использованием _только_ функциональности PD не получится.
Я делал с помощью рендера в текстуру.