Динамическое освещение

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

Модератор: Mikle

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

Динамическое освещение

Сообщение GLEB » 24.10.2005 (Пн) 14:57

Люди скажите как нормально сделать динамическое освещение?
Делаю вот как:

'Рисую стену
g_d3ddevice.SetTexture 0, WallTex 'текстура стены
g_d3ddevice.DrawPrimitiveUP D3DPT_TRIANGLESTRIP, 2, VERT(i * 4), Len(MAPVERT(0))

g_d3ddevice.SetTextureStageState 0, D3DTSS_TEXCOORDINDEX, 0

g_d3ddevice.SetTextureStageState 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1
g_d3ddevice.SetTextureStageState 0, D3DTSS_COLORARG1, D3DTA_TEXTURE
g_d3ddevice.SetTextureStageState 0, D3DTSS_COLORARG2, D3DTA_CURRENT

g_d3ddevice.SetTextureStageState 1, D3DTSS_TEXTURETRANSFORMFLAGS, 2
g_d3ddevice.SetTextureStageState 1, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEPOSITION
g_d3ddevice.SetTextureStageState 1, D3DTSS_ADDRESSU, D3DTADDRESS_BORDER
g_d3ddevice.SetTextureStageState 1, D3DTSS_ADDRESSV, D3DTADDRESS_BORDER

g_d3ddevice.SetTextureStageState 1, D3DTSS_COLOROP, D3DTOP_MODULATE
g_d3ddevice.SetTextureStageState 1, D3DTSS_COLORARG1, D3DTA_TEXTURE
g_d3ddevice.SetTextureStageState 1, D3DTSS_COLORARG2, D3DTA_CURRENT

g_d3ddevice.SetTextureStageState 1, D3DTSS_ALPHAOP, D3DTOP_SUBTRACT
g_d3ddevice.SetTextureStageState 1, D3DTSS_ALPHAARG1, D3DTA_TEXTURE
g_d3ddevice.SetTextureStageState 1, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE

g_d3ddevice.SetRenderState D3DRS_ALPHABLENDENABLE, 1
g_d3ddevice.SetRenderState D3DRS_SRCBLEND, D3DBLEND_SRCALPHA
g_d3ddevice.SetRenderState D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA

g_d3ddevice.SetTexture 0, WallTex
g_d3ddevice.SetTexture 1, SpLight 'пятно света на черном фоне и черный цвет в альфа канале

D3DXMatrixTranslation Mtrx, 0, 0, -0,008 ' сдвигаю стену немного вперед и рисую еще раз
g_d3ddevice.SetTransform D3DTS_WORLD, Mtrx
g_d3ddevice.DrawPrimitiveUP D3DPT_TRIANGLESTRIP, 2, VERT(i * 4), Len(MAPVERT(0))

'восстановление исходных параметров
g_d3ddevice.SetRenderState D3DRS_ALPHABLENDENABLE, 0
g_d3ddevice.SetRenderState D3DRS_SRCBLEND, 1
g_d3ddevice.SetRenderState D3DRS_DESTBLEND, 1
g_d3ddevice.SetTextureStageState 1, D3DTSS_COLOROP, 0
g_d3ddevice.SetTexture 1, Nothing

Что-то не нравится мне этот способ. Может можно как-то более рационально это сделать?

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

Сообщение Mikle » 24.10.2005 (Пн) 16:33

GLEB
Сильно не вникал. Пока первое - вместо сдвигания стены лучше изменить zFunc.

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

Сообщение GLEB » 24.10.2005 (Пн) 17:58

Mikle, Объясни что за zFunc?
Сильно не вникал.

Да, написал я немного лишнего, стены сдвигать не надо.
А принцип таков:
Сначала рисуется стена как обычно с одной текстурой.
Затем еще раз рисую эту стену с двумя текстурами.
1 текстура та же. (D3DTSS_COLOROP, D3DTOP_SELECTARG1) - всегда яркая
2 текстура - пятно света, с альфа каналом (D3DTSS_COLOROP, D3DTOP_MODULATE + D3DTSS_ALPHAOP, D3DTOP_SUBTRACT),
получается отдельное световое пятно.
На фоне стены выглядит как свет фонаря.
Меня не устраивает то что приходится рендерить дважды одно и тоже (fps падает со 100 до 50, но без этого наверное необойтись или нет?).
И то что пятно надо рисовать позже основной стены, а для моей видюшки желательно выполнять сортировку полигонов т. к. это значительно повышает fps.

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

Сообщение Mikle » 25.10.2005 (Вт) 9:06

GLEB
Попробуй в первую стадию (не проход!) просуммировать свет фонаря и Diffuse, а во вторую наложить основную текстуру примерно так:

Код: Выделить всё
    Device.SetTextureStageState 0, D3DTSS_COLOROP, D3DTOP_ADD
    Device.SetTextureStageState 0, D3DTSS_COLORARG1, D3DTA_TEXTURE
    Device.SetTextureStageState 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE

    Device.SetTextureStageState 0, D3DTSS_TEXTURETRANSFORMFLAGS, 2
    Device.SetTextureStageState 0, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEPOSITION
    Device.SetTextureStageState 0, D3DTSS_ADDRESSU, D3DTADDRESS_BORDER
    Device.SetTextureStageState 0, D3DTSS_ADDRESSV, D3DTADDRESS_BORDER

    Device.SetTextureStageState 1, D3DTSS_COLOROP, D3DTOP_MODULATE
    Device.SetTextureStageState 1, D3DTSS_COLORARG1, D3DTA_TEXTURE
    Device.SetTextureStageState 1, D3DTSS_COLORARG2, D3DTA_CURRENT
    Device.SetTextureStageState 1, D3DTSS_TEXCOORDINDEX, 0

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

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

Сообщение GLEB » 26.10.2005 (Ср) 13:04

Списибо, Mikle, получилось то что хотел, fps падает, но терпеть можно.
И еще небольшой вопрос: куда добавить еще одну текстуру (например, тень или статический свет)?

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

Сообщение Mikle » 26.10.2005 (Ср) 19:04

GLEB
Статический свет идет через Diffuse, то есть у тебя он УЖЕ ЕСТЬ, осталось включить.
Тень - третья стадия или, если не держит видеокарта - второй проход. Хотя все зависит от того, КАК делать тень.


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

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

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

    TopList