попиксельное освещение, часть первая.

Работа с 2D и 3D графикой, видео, звуком.

Модератор: Mikle

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 08.04.2005 (Пт) 9:23

d3drm
Это ты перевел пример из SDK по СИ++?

Разобрал пример и немного разочаровался. DOT3, причем не очень эффектный, приходится постоянно пересчитывать вертексы. Камень на полу не выпуклый, а вогнутый, при этом больше похож на металл. Комната состоит из 10 прямоугольных плоскостей, то есть могла бы состоять из 20 треугольников, а там их больше 900. Зачем? Отвечаю, стена разбита на сетку, так осуществлена смена яркости в зависимости от расстояния до источника света. А направление света на всей стене ОДНО И ТО ЖЕ. Присмотритесь, если часть стены слева от ист. света освещена справа (что правильно), то так же освещены участки ЭТОЙ ЖЕ СТЕНЫ и справа, и сверху. Меняется только яркость.
Сначала я думал, что это плохой нормал-мэп, но нет, он отличный (мне бы научиться такие делать). Сейчас делаю полностью свой вариант, доделаю - выложу. Правда на MX он уже не пойдет за один проход, но за два - можно.
:evil: Блин, такое интересное занятие, а меня постоянно отвлекают на мелочи - сходи на работу, обедай, спи!!! :evil: :lol: .

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 08.04.2005 (Пт) 22:25

Mikle, не совсем. Нашел пример где-то в сети, но он был под openGL на с++. я его уже почти переделал, когда нашел на том же сайте тот же пример только под DX9 :lol:


На счет эффективности. Я думаю в будущем перевести все на код шейдеров, что будет намного эффективнее. Немного не понял с освещением справа-слева, но точно знаю что там багов достаточно, над этим сейчас работаю.

надеюсь вместе что-нибудь получится =) :D

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 09.04.2005 (Сб) 10:22

Вот то, о чем я говорил. Пример еще не доработан, по такому методу перерассчет придется делать не для каждого вертекса, а для каждой плоскости, то есть для той комнаты понадобится не 900, а 10 рассчетов. В примере пол состоит всего из двух треугольников, при этом на каждом участке реально отображается не только освещенность, но и направление света.
Немного не понял с освещением справа-слева

Присмотрись в своем примере, все участки одной стены всегда освещены с одной стороны, это не сразу бросается в глаза, так как освещенность (НЕ НАПРАВЛЕНИЕ СВЕТА!) сделана правильно.
Сейчас в примере задействовано три стадии текстурирования, то есть на MX он не пойдет, чтобы пошел, нужно переделать на два прохода. В перспективе хочу добиться того же эффекта вообще без перерассчетов для сцены любой сложности, прикидываю, что добавится источник света и одна стадия текстурирования. Текстуру света для этого нужно будет сделать проективной, пока никак не могу рассчитать нужную матрицу.
Управление - стрелки + мышь, перемещение источника света - WASD. Сам источник я не отобразил.

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 09.04.2005 (Сб) 23:06

у меня на
Код: Выделить всё
d3dx.FilterTexture LTex, ByVal 0, 0&, D3DX_FILTER_LINEAR
выдает ошипку (((

когда отключаю то показывает баги, если камера стоит далеко от куска пола. Некоторые участки освещаются, когда не должны быить освещены

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 09.04.2005 (Сб) 23:12

как понимаю код на первый взгляд - свет - это текстура, а как она будет действовать на карту или модель со сложной геометрией?

Anatron
Обычный пользователь
Обычный пользователь
 
Сообщения: 62
Зарегистрирован: 21.08.2002 (Ср) 20:22
Откуда: Златоуст, Челябинская обл.

Сообщение Anatron » 10.04.2005 (Вс) 6:42

А у меня вылетает в строке:
Set LTex = d3dx.CreateTexture(d3dDevice, Size, Size, D3DX_DEFAULT, D3DUSAGE_DYNAMIC, D3DFMT_X8R8G8B8, D3DPOOL_DEFAULT)
Изменил D3DUSAGE_DYNAMIC на D3DUSAGE_RENDERTARGET и заработало... не знаю как это должно отобразиться на картинке, но мне понравилось то, что я увидел.

Bonesnapper
Постоялец
Постоялец
 
Сообщения: 434
Зарегистрирован: 12.09.2004 (Вс) 15:39

Сообщение Bonesnapper » 10.04.2005 (Вс) 8:23

У меня все работает

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 10.04.2005 (Вс) 9:07

Anatron
D3DUSAGE_RENDERTARGET не должен ничего изменить по сравнению с D3DUSAGE_DYNAMIC. Разве что только быстродействие.
d3drm
Свет - это ПРОЕКТИВНАЯ текстура, поэтому нормально ляжет на геометрию любой сложности, а вот направление света будет показываться не корректно, поэтому я и написал, что нужно делать перерассчет для каждой плоскости. Сейчас пытаюсь это обойти. Попробуй как Anatron поставь RENDERTARGET, может фильтр заработает, или замени D3DX_FILTER_LINEAR на D3DX_FILTER_BOX.

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 10.04.2005 (Вс) 9:41

сделал как ты советуешь, пропал глюк с освещением отдаленных частей карты.

Очень красиво смотрица, надо попробовать сдедать карту посложнее и посмотреть как она будет работать, скорость и т.п.
ХЎ

Bonesnapper
Постоялец
Постоялец
 
Сообщения: 434
Зарегистрирован: 12.09.2004 (Вс) 15:39

Сообщение Bonesnapper » 10.04.2005 (Вс) 13:16

при движении светового 'пятна'
в отдалении от центра
видны какие-то темные переходы света (ступеньчато)
и можно ли поменять цвет света

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 10.04.2005 (Вс) 13:31

видны какие-то темные переходы света (ступеньчато)

Ничего не поделаешь. 32 битного цвета уже мало. Точнее для вывода на экран и для текстур достаточно, а для промежуточных рассчетов хорошо бы использовать 64 бита. Надеюсь на новых 64-битных компьютерах так и сделают.
можно ли поменять цвет света

Согласно документации DOT3 не предназначен для цветного света, но сделать можно, еще чуть-чуть доделаю и выложу новый пример.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 10.04.2005 (Вс) 17:25

Новая версия. Так как у многих глючило создание текстуры - теперь просто грузим ее из файла. Текстуру камня и нормал-мэп в архив не включил - добавьте сами.
К управлению добавилось:
z, x - перемещение ист. света вверх-вниз.
1, 2, 3 - добавить соответственно R, G, B компоненту света.
4, 5, 6 - убавить то же.

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 10.04.2005 (Вс) 21:06

клевый шарик... =)
ХЎ

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 11.04.2005 (Пн) 8:26

Там ошибки - вот стейты для модуля Bump:
Код: Выделить всё
  d3dDevice.SetTextureStageState 0&, D3DTSS_ADDRESSU, D3DTADDRESS_CLAMP
  d3dDevice.SetTextureStageState 0&, D3DTSS_ADDRESSV, D3DTADDRESS_CLAMP
  d3dDevice.SetTextureStageState 0&, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2
  d3dDevice.SetTextureStageState 0&, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEPOSITION
  d3dDevice.SetTextureStageState 0&, D3DTSS_COLOROP, D3DTOP_SELECTARG1
  d3dDevice.SetTextureStageState 0&, D3DTSS_COLORARG1, D3DTA_TEXTURE

  d3dDevice.SetTextureStageState 1&, D3DTSS_COLOROP, D3DTOP_DOTPRODUCT3
  d3dDevice.SetTextureStageState 1&, D3DTSS_COLORARG1, D3DTA_CURRENT
  d3dDevice.SetTextureStageState 1&, D3DTSS_COLORARG2, D3DTA_TEXTURE
  d3dDevice.SetTextureStageState 1&, D3DTSS_TEXCOORDINDEX, 0&

  d3dDevice.SetTextureStageState 2&, D3DTSS_COLOROP, D3DTOP_MODULATE
  d3dDevice.SetTextureStageState 2&, D3DTSS_COLORARG1, D3DTA_CURRENT
  d3dDevice.SetTextureStageState 2&, D3DTSS_COLORARG2, D3DTA_TEXTURE
  d3dDevice.SetTextureStageState 2&, D3DTSS_TEXCOORDINDEX, 0&

  d3dDevice.SetTextureStageState 3&, D3DTSS_COLOROP, D3DTOP_MODULATE4X
  d3dDevice.SetTextureStageState 3&, D3DTSS_COLORARG1, D3DTA_CURRENT
  d3dDevice.SetTextureStageState 3&, D3DTSS_COLORARG2, D3DTA_DIFFUSE

Bonesnapper
Постоялец
Постоялец
 
Сообщения: 434
Зарегистрирован: 12.09.2004 (Вс) 15:39

Сообщение Bonesnapper » 11.04.2005 (Пн) 9:11

Может увеличить разрешение текстуры света чтобы избавиться от ступенчатости

И чем обусловлен выбор текстуры света (сине серо красная) :roll:

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 11.04.2005 (Пн) 10:48

Bonesnapper это карта нормалей.

Mikle, если свет просто проецируется на плоскость, занчит создав карту теней можно ее проецировать подобным образом, и получатся динамические тени?
ХЎ

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 11.04.2005 (Пн) 13:16

d3drm
Динамические тени получатся, проблема создать эту карту. Для ландшафта это не сложно - просто рендеришь все объекты без текстур черным материалом в одну текстуру с нужного ракурса. Но для объектов это не годится - нужно для каждого делать свой рендер в текстуру. А если нужно самозатенение - делим меши на выпуклые сабсеты, упорядочиваем и для каждого сабсета делаем рендер в текстуру.
Bonesnapper
Не поможет. Одна ступенька - это разница между значениями 128 и 129 (или например 131 и 132)в компоненте Blue текстуры света. Размер текстуры тут не при чем.

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 12.04.2005 (Вт) 23:57

Mikle, покопался в твоем примере и вот что нашел. Вертикальные стенки освещаются неправильно, то есть ширина освещения правильная, по высота идет вдоль всего полигона. Есть идеи как это исправить? мне пока в голову ничего не приходит...
ХЎ

Bonesnapper
Постоялец
Постоялец
 
Сообщения: 434
Зарегистрирован: 12.09.2004 (Вс) 15:39

Сообщение Bonesnapper » 13.04.2005 (Ср) 8:27

А что полной темноты не получится
(после определенного растояния от шара пол перестает чернеть)

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 14.04.2005 (Чт) 13:21

d3drm
Я же писал, что для каждой плоскости нужно перерассчитывать матрицу текстуры. По-позже сделаю явную формулу.
Bonesnapper
Это я сделал специально, так естественней, чем если ба на некотором расстоянии свет исчезал полностью. Переделать не сложно.

Вот я реализовал этот пример тремя способами рендера. Два прохода - для MX-ов. По крайней мере на MX440 работает. Просьба Юричу проверить на MX400.
Ну и есть вариант на пиксельном шейдере. :wink:
http://www.gamedev.ru/download/?id=2039

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 14.04.2005 (Чт) 16:28

Mikle у меня работают все три способа, скорость примерно одинаковая ~500 fps когда камера смотрит на источник света.

При просчете для каждой плоскости полагаю скорость жестоко упадет даже при небольшом кол-ве полигонов...
ХЎ

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 14.04.2005 (Чт) 16:49

А с чего она должна упасть? В твоем примере для комнаты матрица пересчитывается 2880 раз! В моем варианте для этой комнаты хватит 10 раз, да и сам рассчет попроще. Мой пример больше тормозит на филрейте, так как накладывается три текстуры, а не две, а вот как раз при увеличении кол-ва деталей он должен вырываться вперед.

Yurich
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 675
Зарегистрирован: 05.03.2003 (Ср) 3:43
Откуда: DONBASS/Gorlovka

Сообщение Yurich » 14.04.2005 (Чт) 22:30

Mikle писал(а):Вот я реализовал этот пример тремя способами рендера. Два прохода - для MX-ов. По крайней мере на MX440 работает. Просьба Юричу проверить на MX400.

Mikle
К моему сожалению не работает.
1. Запустил только после замены Usage
Set LTex = d3dx.CreateTexture(d3dDevice, Size, Size, 1&, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT)
Сдк собственно пишет:
0 or the D3DUSAGE_RENDERTARGET member of the CONST_D3DUSAGEFLAGS enumeration?!
2. На экране просто черное поле. Star не виден вообще. Иногда вместо него светится что-то подобное стенке или просто цветные точки. Текстура искажена - точнее сказать отсутствует.
Цвет стенки меняется Black-Blue-Green-Red.
- Какой треугольник не подвластен законам геометрии?
- У которого все углы тупые!

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 15.04.2005 (Пт) 9:15

Yurich
Благодарю. Придется мне найти GF2MX и поэкспериментировать.

Yurich
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 675
Зарегистрирован: 05.03.2003 (Ср) 3:43
Откуда: DONBASS/Gorlovka

Сообщение Yurich » 16.04.2005 (Сб) 11:31

Mikle писал(а):Yurich
Благодарю. Придется мне найти GF2MX и поэкспериментировать.

Не обязательно искать!
Картинку мне удалось получить.
1. Переключил на SOFTWARE_VERTEXPROCESSING
2. Заремарил во втором проходе строки
'd3dDevice.SetTextureStageState 2&, D3DTSS_COLOROP, D3DTOP_MODULATE4X
'd3dDevice.SetTextureStageState 2&, D3DTSS_COLORARG1, D3DTA_CURRENT
'd3dDevice.SetTextureStageState 2&, D3DTSS_COLORARG2, D3DTA_DIFFUSE
Я еще не вник в детали, не знаю как должно выглядеть на самом деле и в чем ошибка (здается индекс 2&).
- Какой треугольник не подвластен законам геометрии?
- У которого все углы тупые!

Anatron
Обычный пользователь
Обычный пользователь
 
Сообщения: 62
Зарегистрирован: 21.08.2002 (Ср) 20:22
Откуда: Златоуст, Челябинская обл.

Сообщение Anatron » 16.04.2005 (Сб) 21:17

Как писал Юрич, прога у меня тоже запускается только после смены USAGE на D3DUSAGE_RENDERTARGET. Это что, от видюхи зависит? У меня Radeon 9000 Pro 128.
А так, все три способа работают от и до. Но 2-ой самый шустрый(100 fps), а шейдерный и за два прогона способы выдают одинаковые 80-90 fps.[/quote]

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 17.04.2005 (Вс) 10:07

Yurich
Примерно ясно. GF4MX ограничивает число текстур на проход - не больше двух, а GF2MX ограничивает число текстурных стадий.
А вот почему тебе всегда приходится мой код переключать на SOFTWARE_VERTEXPROCESSING, вообще не понятно - GF2MX держит HARDWARE.

Пред.

Вернуться в Мультимедиа

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 44

    TopList