Освещение

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

Модератор: Mikle

GLEB
Бывалый
Бывалый
 
Сообщения: 246
Зарегистрирован: 24.05.2005 (Вт) 12:16

Освещение

Сообщение GLEB » 12.09.2005 (Пн) 20:40

Как сделать освещение по типу фонаря, что слышал про lightmap, но найти не могу ничего. Может есть у кого примерчик какой нибудь.

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

Сообщение d3drm » 12.09.2005 (Пн) 21:31

используй SPOT тип освещения

GLEB
Бывалый
Бывалый
 
Сообщения: 246
Зарегистрирован: 24.05.2005 (Вт) 12:16

Сообщение GLEB » 13.09.2005 (Вт) 11:21

А разве можно получить световое пятно на большой плоскости состоящей всего из 2 треугольников. А на более мелкие части дробить плоскость не хочется.

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

Сообщение d3drm » 13.09.2005 (Вт) 20:55

ну начнем с того, что lightmap - дело статическое и динамики у тебя не будет. это раз. во-вторых, подумай, хватит ли у тебя сноровки все это реализовать. Lightmaps - дело не очень простое, скорее даже очень непростое, так что все-таки тебе легче будет разделить плоскость на большее кол-во полигонов
ХЎ

GLEB
Бывалый
Бывалый
 
Сообщения: 246
Зарегистрирован: 24.05.2005 (Вт) 12:16

Сообщение GLEB » 14.09.2005 (Ср) 6:39

Ну во-первых разбивать плоскость на большее кол-во полигонов неудобно, а во-вторых к примеру на моей видеокарте это с повлияет на производительность. Ну а как к примеру сделан фонарь в HL1, вроде бы на SPOT не похоже.

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

Сообщение d3drm » 14.09.2005 (Ср) 18:51

=) а на что похоже? ))

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

GLEB
Бывалый
Бывалый
 
Сообщения: 246
Зарегистрирован: 24.05.2005 (Вт) 12:16

Сообщение GLEB » 14.09.2005 (Ср) 20:19

Ну а если динамически двигать световое пятно, тогда что. В half-life оно чем-то похоже на плоскость с текстурой.

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

Сообщение d3drm » 14.09.2005 (Ср) 20:21

если ты хочешь динамики, тогда стопудово только spot light и годится. Если у тебя слабая машина, то ни о каком попиксельном освещении и речи быть не может. в hl используются и динамическое освещение, и лайтмэпы.
ХЎ

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

Сообщение Mikle » 15.09.2005 (Чт) 9:12

Есть вариант накладывать проективную текстуру.

GLEB
Бывалый
Бывалый
 
Сообщения: 246
Зарегистрирован: 24.05.2005 (Вт) 12:16

Сообщение GLEB » 15.09.2005 (Чт) 13:11

Mikle, объясни пожалуйста поподробнее.

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

Сообщение d3drm » 15.09.2005 (Чт) 20:09

Mikle, зачем человеку череп воротишь? :lol: Теперь объясняй :D
ХЎ

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

Сообщение Mikle » 16.09.2005 (Пт) 9:32

GLEB
Делается:
Код: Выделить всё
  d3dDevice.SetTextureStageState n, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2
  d3dDevice.SetTextureStageState n, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEPOSITION

Затем матрицу текстуры соответствующей стадии (n) можно менять, и накладывать текстуру, умножая на Diffuse при включенно источнике света. При этом на требуется от адаптера совместимость с попиксельным освещением. Можно получить эффект, подобный кинопроектору или прохождение света через витраж. Можно получить луч фонаря не просто круглый и равномерный, а... не знаю как выразиться... как в DOOM3.

GLEB
Бывалый
Бывалый
 
Сообщения: 246
Зарегистрирован: 24.05.2005 (Вт) 12:16

Сообщение GLEB » 16.09.2005 (Пт) 10:48

А можно ли перед стеной расположить плоскость с текстурой частично прозрачного светового пятна. Вот только как сделать чтобы изображение этого пятна составлялось из того что находится за ним, без учета света от источников (ну чтоб было всегда ярким независимо освещенна стена или вокгруг полная темнота).

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

Сообщение d3drm » 16.09.2005 (Пт) 13:27

GLEB, для второй плоскости при рендеринге просто выключать свет.

Mikle, помнится в твоем примере с бампмеппингом практиковалась данная фича... Вот только облом, если полигон лежит не в плоскости xz, что тогда?
ХЎ

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

Сообщение Mikle » 16.09.2005 (Пт) 13:52

d3drm
Облом только в случае с DOT-Product, потому что меняется нормаль. А для обычного проектирования текстуры на сцену это подходит независимо от сложности сцены.

GLEB
Бывалый
Бывалый
 
Сообщения: 246
Зарегистрирован: 24.05.2005 (Вт) 12:16

Сообщение GLEB » 16.09.2005 (Пт) 16:42

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

SetupLight 'источник света POINT
'рисование стены
d3ddevice.SetTexture 0, Texture1 'текстура стены
d3ddevice.DrawPrimitive D3DPT_TRIANGLESTRIP, 0, 2

'рисование пятна
d3ddevice.SetRenderState D3DRS_LIGHTING, 0
d3ddevice.SetRenderState D3DRS_SRCBLEND, 2 'D3DBLEND_SRCALPHA
d3ddevice.SetRenderState D3DRS_DESTBLEND, 2 'D3DBLEND_INVSRCALPHA
d3ddevice.SetRenderState D3DRS_ALPHABLENDENABLE, 1

d3ddevice.SetTexture 0, Texture2 ' текстура светового пятна
d3ddevice.DrawPrimitive D3DPT_TRIANGLESTRIP, 4, 2

d3ddevice.SetRenderState D3DRS_ALPHABLENDENABLE, 1
d3ddevice.SetRenderState D3DRS_LIGHTING, 1

Что сделать?

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

Сообщение d3drm » 16.09.2005 (Пт) 21:28

Mikle, будет время - сделай примерчик, а? )))
ХЎ

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

Сообщение Mikle » 17.09.2005 (Сб) 13:48

Сделаю.

GLEB
Бывалый
Бывалый
 
Сообщения: 246
Зарегистрирован: 24.05.2005 (Вт) 12:16

Сообщение GLEB » 17.09.2005 (Сб) 20:07

Вы это про мой вопрос? Или что.

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

Сообщение d3drm » 17.09.2005 (Сб) 22:18

Или что. :) ответ на проективное освещение.
ХЎ

GLEB
Бывалый
Бывалый
 
Сообщения: 246
Зарегистрирован: 24.05.2005 (Вт) 12:16

Сообщение GLEB » 23.09.2005 (Пт) 20:43

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

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

Сообщение Mikle » 24.09.2005 (Сб) 16:46

Вот обещанное. Долго делал - работы было много.
Управление:
Перемещение - мышь + стрелки
Перемещение источника света - WASD
Смена направления света - Home, End, Delete, Page Down
Сам источник света (окно, витраж) не видим.
GLEB
Чтобы зависило от освещения - ты Texture умножаешь на Diffuse, чтобы не зависило - оставь SelectArg1, Texture. Если это не то - объясни понятнее.

GLEB
Бывалый
Бывалый
 
Сообщения: 246
Зарегистрирован: 24.05.2005 (Вт) 12:16

Сообщение GLEB » 24.09.2005 (Сб) 20:15

Mikle, благодарю за пример.
Texture умножаешь на Diffuse, чтобы не зависило - оставь SelectArg1
Как это выглядит в виде кода VB?

Ну вот есть плоскость с текстурой, она не освещена(черная вся, соотв. текстуру на ней не видно). Перед ней на небольшом расст. еще одна плоскость с текстурой света с альфа-каналом. Свет для нее отключен(она всегда яркая). Как сделать чтоб сквозь нее просвечивалась первая плоскость, чтобы было видно текстуру первой плоскости.

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

Сообщение d3drm » 25.09.2005 (Вс) 0:04

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

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

Сообщение Mikle » 25.09.2005 (Вс) 10:27

d3drm
Придется делать многократный рендер в текстуру.

1. Создаешь ЗАРАНЕЕ текстуру с отрендеренной тенью от статичной геометрии.
2. Сортируешь подвижные объекты по удалению от источника света.
3. Делаешь копию теневой текстуры в рендер-таржет.
4. Устанавливаешь счетчик подвижных объектов (N) в 1.
5. Рендеришь N-ный объект в бэкбуфер, используя рендер-таржет текстуру.
6. Рендеришь N-ный объект в рендер-таржет текстуру, используя черный материал.
7. N=N+1: If N<=MaxObjCount THEN GoTo 5

Из-за постоянного переключения рендер-таржет такая схема годится только для малого кол-ва подвижных объектов. Можно рендерить объекты в текстуру сразу все, но тогда они не будут затенять друг друга - только архитектуру.
Возможна оптимизация, например рендерить объекты в текстуру пачками, заранее вычисляя те, которые друг друга не затеняют.

GLEB
Текстуру, которая уже отрендерена невидимой - видимой не сделаешь. Используй мультитекстурирование. Никаких на небольшом расстоянии плоскостей не нужно. На первой стадии рендеришь текстуру самой стены, ярко, не затеняя. На второй накладываешь тень.
Это упрощенный вариант, когда заранее рассчитаны текстуры тени, даже не нужен второй проход.
Код: Выделить всё
  d3dDevice.SetTextureStageState 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1
  d3dDevice.SetTextureStageState 0, D3DTSS_COLORARG1, D3DTA_TEXTURE
 
  d3dDevice.SetTextureStageState 1, D3DTSS_COLOROP, D3DTOP_MODULATE
  d3dDevice.SetTextureStageState 1, D3DTSS_COLORARG1, D3DTA_CURRENT
  d3dDevice.SetTextureStageState 1, D3DTSS_COLORARG1, D3DTA_TEXTURE

GLEB
Бывалый
Бывалый
 
Сообщения: 246
Зарегистрирован: 24.05.2005 (Вт) 12:16

Сообщение GLEB » 25.09.2005 (Вс) 16:22

Вот что получилось

d3ddevice.SetRenderState D3DRS_AMBIENT, D3DColorRGBA(100, 100, 100, 0)
d3ddevice.SetTexture 0, Texture1 'текстура стены
d3ddevice.SetTexture 1, Texture2 'текстура светового пятна
d3ddevice.SetTextureStageState 0, D3DTSS_TEXCOORDINDEX, 0

d3ddevice.SetTextureStageState 1, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2
d3ddevice.SetTextureStageState 1, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEPOSITION
d3ddevice.SetTextureStageState 1, D3DTSS_ADDRESSU, D3DTADDRESS_BORDER
d3ddevice.SetTextureStageState 1, D3DTSS_ADDRESSV, D3DTADDRESS_BORDER

d3ddevice.SetTextureStageState 1, D3DTSS_COLOROP, D3DTOP_MODULATE4X
d3ddevice.SetTextureStageState 1, D3DTSS_COLORARG1, D3DTA_TEXTURE
d3ddevice.SetTextureStageState 1, D3DTSS_COLORARG2, D3DTA_CURRENT

Но как теперь сделать, чтобы неосвещенная часть Texture1 была D3DColorRGBA(100, 100, 100, 0), а не черной, при альфаблендинге альфаблендятся обе текстуры.
У вас нет доступа для просмотра вложений в этом сообщении.


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

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

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

    TopList