Проблема с Shadow Volume

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

Модератор: Mikle

djalex777
Постоялец
Постоялец
 
Сообщения: 461
Зарегистрирован: 23.03.2006 (Чт) 16:02

Проблема с Shadow Volume

Сообщение djalex777 » 21.04.2008 (Пн) 12:14

При попадании камеры внутрь теневого объема возникает проблема с отображением тени. Нет ли у кого примера для решения этой проблемы?

StimorolD3DX
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 293
Зарегистрирован: 03.04.2007 (Вт) 18:19
Откуда: Kiev city

Сообщение StimorolD3DX » 22.04.2008 (Вт) 17:53

При попадении во внутрь волюма меняй куллинг на противоположный.
Последний раз редактировалось StimorolD3DX 24.04.2008 (Чт) 10:14, всего редактировалось 1 раз.

lellel
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 207
Зарегистрирован: 19.12.2007 (Ср) 22:07
Откуда: Долгопрудный

Сообщение lellel » 10.05.2008 (Сб) 21:56

не то чтобы "в тему", но все же.. а Shadow Volume это тени? т.е. нормальные тени которые отбрасывают все предметы?
а может кто нибудь кинуть примерчик? пожалуйста..

DirectXManiac
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1543
Зарегистрирован: 03.11.2005 (Чт) 13:32
Откуда: из DirectX SDK

Сообщение DirectXManiac » 12.05.2008 (Пн) 22:57

lellel
Куча раз тема обсуждалась и пример тоже есть. Поиск по форуму!!!
#define ROFL 0xDDDD

lellel
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 207
Зарегистрирован: 19.12.2007 (Ср) 22:07
Откуда: Долгопрудный

Сообщение lellel » 13.05.2008 (Вт) 18:28

ок

djalex777
Постоялец
Постоялец
 
Сообщения: 461
Зарегистрирован: 23.03.2006 (Чт) 16:02

Сообщение djalex777 » 25.07.2008 (Пт) 19:22

Отбрасывается две тени от разных боксов. Когда стенсильные тени пересекаются, то они накладываются друг на друга. И накладываются их альфа-каналы и в месте наложения тень становится темнее. А как избежать изменения прозрачности тени при наложении на неё другой тени?

Ktulhu
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 132
Зарегистрирован: 14.07.2007 (Сб) 14:03
Откуда: Киев, Р'льех

Сообщение Ktulhu » 26.07.2008 (Сб) 16:48

djalex777
стенсильные тени не должны накладыватся. Возможно, ты боксы рисуешь в разные маски.

djalex777
Постоялец
Постоялец
 
Сообщения: 461
Зарегистрирован: 23.03.2006 (Чт) 16:02

Сообщение djalex777 » 26.07.2008 (Сб) 20:17

Ktulhu, Спасибо, с твоей помощью разобрался (от каждого объекта тень сразу отрисовывал в буфер кадра). Есть ещё проблемка - если смотреть на объект со стороны тени (не находясь внутри её) возникает мерцание на объекте. С чем это может быть связано?
У вас нет доступа для просмотра вложений в этом сообщении.

StimorolD3DX
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 293
Зарегистрирован: 03.04.2007 (Вт) 18:19
Откуда: Kiev city

Сообщение StimorolD3DX » 27.07.2008 (Вс) 11:23

Ну мерцание это наверняка Z-bufer'у нужно установить тип 24S8

djalex777
Постоялец
Постоялец
 
Сообщения: 461
Зарегистрирован: 23.03.2006 (Чт) 16:02

Сообщение djalex777 » 27.07.2008 (Вс) 14:53

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

djalex777
Постоялец
Постоялец
 
Сообщения: 461
Зарегистрирован: 23.03.2006 (Чт) 16:02

Проблема решена

Сообщение djalex777 » 20.08.2008 (Ср) 19:58

Вот, добился я наконец-то нужного результата. Теперь тени рисуются всегда правильно, даже если камера находится внутри теневого объёма. Выкладываю исходники, может кому понадобятся. Для большей скорости одна из функций переписана на c++ и скомпилирована в библиотеку dxwrap.dll

Немного слов о том, как пользоваться:

Код: Выделить всё
Dim Shadow As New classShadowVolume3D 'Объявляем наш теневой объем
Dim vLight As D3DVECTOR                        'Позиция источника света
Dim bMesh As D3DXMESH                          'Объект
...
sub Render() 'Прорисовка (каждый кадр)
Dim mat As D3DMATRIX                              'Матрица объекта bMesh
...
Shadow.Reset                                            'Сброс буфера теневого объема
Shadow.BuildFromMesh bMesh, vLight         'Создание теневого объема из bMesh
SHADOW_MOD.RenderShadow Shadow, mat 'Отрисовка теневого объема в стенсильный буфер
SHADOW_MOD.DrawShadow                        'Отрисовка тени в экранный буфер
...
end sub


Примечание. Если объект и свет не меняют своего положения, то создать теневой объем можно только при инициализации объектов, т.е. не надо каждый кадр вызывать Shadow.Reset: Shadow.BuildFromMesh(...)
У вас нет доступа для просмотра вложений в этом сообщении.

lellel
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 207
Зарегистрирован: 19.12.2007 (Ср) 22:07
Откуда: Долгопрудный

Re: Проблема с Shadow Volume

Сообщение lellel » 21.08.2008 (Чт) 11:43

любопытно, но у меня не вышло..
вроде все сделал правильно, только вот не знаю, что полагается с DLL елать.. я просто положил его в Систем32.. пробовал подключить к пректу, но не вышло: "Can't add a reference to the specified file"
если пользоваться BuildFromMesh бейсик просто выключается с нейзвесной ошибкой (под вистой), или вообще "молча" (под икспи)
если пользоваться BuildFromMesh1 возникает ошибка в строке
D3DXVec3Cross vNormal, MathVec3(v2, v1, MATH_MINUS), MathVec3(v1, v0, MATH_MINUS)
бейсик не знает что такое MATH_MINUS, да и что такое MathVec3..
можно решить проблему?
порбовал под икспи и вистой.. не работает..

djalex777
Постоялец
Постоялец
 
Сообщения: 461
Зарегистрирован: 23.03.2006 (Чт) 16:02

Сообщение djalex777 » 21.08.2008 (Чт) 21:43

Библиотеку нужно положить в директорию с проектом. Если будет писать, что библиотека не найдена при запуске проекта, то при загрузке формы нужно выставить текущий каталог равным каталогу, где лежит библиотека (chdir app.path)

lellel
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 207
Зарегистрирован: 19.12.2007 (Ср) 22:07
Откуда: Долгопрудный

Re: Проблема с Shadow Volume

Сообщение lellel » 21.08.2008 (Чт) 23:03

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

djalex777
Постоялец
Постоялец
 
Сообщения: 461
Зарегистрирован: 23.03.2006 (Чт) 16:02

Re: Проблема с Shadow Volume

Сообщение djalex777 » 22.08.2008 (Пт) 16:03

Странно... В библиотеке точно всё впорядке. У меня работает и под xp и под Вистой. В принципе там есть та же функция, только на VB. Про MathVec3

Код: Выделить всё
Enum MATHVEC3_OPERATION
MATH_PLUS = 0
MATH_MINUS = 1
End Enum
Function MathVec3(a As D3DVECTOR, b As D3DVECTOR, operation As MATHVEC3_OPERATION) As D3DVECTOR
Select Case operation
  Case 0:
   MathVec3 = vec3(a.x + b.x, a.y + b.y, a.z + b.z)
  Case 1:
   MathVec3 = vec3(a.x - b.x, a.y - b.y, a.z - b.z)
End Select
End Function

lellel
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 207
Зарегистрирован: 19.12.2007 (Ср) 22:07
Откуда: Долгопрудный

Re: Проблема с Shadow Volume

Сообщение lellel » 22.08.2008 (Пт) 23:48

тени, это очень интересно! только увы, у меня не вышло даже с помощью функции на VB.. наверное я что то непоянл, и потому сделал что то не так..
djalex777 может примерчик дашь? там сам разберусь что у меня не так..

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Проблема с Shadow Volume

Сообщение Хакер » 23.08.2008 (Сб) 11:32

djalex777, это ты MathVec что-ли на С++ переписывал ради большей скорости?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

djalex777
Постоялец
Постоялец
 
Сообщения: 461
Зарегистрирован: 23.03.2006 (Чт) 16:02

Сообщение djalex777 » 23.08.2008 (Сб) 17:43

Хакер писал(а):Это ты MathVec что-ли на С++ переписывал ради большей скорости?


Нет конечно. Функцию построения теневого объема переписывал.

djalex777
Постоялец
Постоялец
 
Сообщения: 461
Зарегистрирован: 23.03.2006 (Чт) 16:02

Re: Проблема с Shadow Volume

Сообщение djalex777 » 23.08.2008 (Сб) 19:22

lellel
Забыл совсем! Извиняюсь. При запуске приложения, после инициализации устройств dx нужно выполнить функцию InitShadowMode(w,h) где w и h - ширина и высота back buffer. Попробуй - должно всё заработать

lellel
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 207
Зарегистрирован: 19.12.2007 (Ср) 22:07
Откуда: Долгопрудный

Re: Проблема с Shadow Volume

Сообщение lellel » 23.08.2008 (Сб) 20:48

так.. теперь наблюдаю общее затемнение всей сцены, будто AMBIENT вдруг упал или материал всего стал темнее..
почитав тему подумал, может дела в формате back buffer? у меня он похоже D3DFMT_R8G8B8..
теперь заработала и библиотека:) (под икспи пока не пробовал, но думаю существенно отличаться не будет)

кстати, а порядок отрисовки важен? типа в случае с полупрозрачностью.. когда положено рисовать тени?

djalex777
Постоялец
Постоялец
 
Сообщения: 461
Зарегистрирован: 23.03.2006 (Чт) 16:02

Re: Проблема с Shadow Volume

Сообщение djalex777 » 23.08.2008 (Сб) 23:55

Так как тени у нас стенсильные, то формат буфера глубины должен быть поддерживающим stencil, например D24S8, где s8 восьми битный стенсильный буфер. Порядок отрисовки имеет значение. Тени будут падать на все отрисованное в текущий момент.

lellel
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 207
Зарегистрирован: 19.12.2007 (Ср) 22:07
Откуда: Долгопрудный

Re: Проблема с Shadow Volume

Сообщение lellel » 24.08.2008 (Вс) 12:12

гм.. теперь есть что то вроде тени, только не там, то есть не на плоскости "пола", а на плоскости экрана..
скрин приложу...
вот моя инициализация директа:
Код: Выделить всё
Dim DispMode As D3DDISPLAYMODE
Dim d3dpp As D3DPRESENT_PARAMETERS

  Set d3d = dx8.Direct3DCreate
  d3d.GetAdapterDisplayMode D3DADAPTER_DEFAULT, DispMode

  d3dpp.Windowed = True
  d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD
  d3dpp.BackBufferFormat = DispMode.Format
  d3dpp.BackBufferWidth = DispMode.Width
  d3dpp.BackBufferHeight = DispMode.Height
  d3dpp.BackBufferCount = 1
  d3dpp.EnableAutoDepthStencil = True
  d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8

  Set d3dDevice = d3d.CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, d3dpp)


в качестве меша использую чайник...
Код: Выделить всё
Set Shadow = New classShadowVolume3D
Shadow.Reset
Shadow.BuildFromMesh bMesh, vLight

запуская только один раз, в рендере только
SHADOW_MOD.RenderShadow Shadow, Mat
SHADOW_MOD.DrawShadow
У вас нет доступа для просмотра вложений в этом сообщении.

djalex777
Постоялец
Постоялец
 
Сообщения: 461
Зарегистрирован: 23.03.2006 (Чт) 16:02

Re: Проблема с Shadow Volume

Сообщение djalex777 » 24.08.2008 (Вс) 13:26

Тут всё правильно. А InitShadowMode с какими параметрами? Должен быть с d3dpp.BackBufferWidth и d3dpp.BackBufferHeight. А vLight чему равен? Это позиция источника света. Выложи исходник, посмотрю что не так

lellel
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 207
Зарегистрирован: 19.12.2007 (Ср) 22:07
Откуда: Долгопрудный

Re: Проблема с Shadow Volume

Сообщение lellel » 24.08.2008 (Вс) 13:31

vLight = vec3(1, -1, 1)
вот исходник.. спасибо:)
У вас нет доступа для просмотра вложений в этом сообщении.

djalex777
Постоялец
Постоялец
 
Сообщения: 461
Зарегистрирован: 23.03.2006 (Чт) 16:02

Re: Проблема с Shadow Volume

Сообщение djalex777 » 24.08.2008 (Вс) 16:57

Во-первых, ты не очищаешь stencil буфер. Еще в модуле shadow_mod закоментирован кусочек кода с установкой d3dcull_ccw, его нужно раскоментировать. Просто я у себя в проекте нигде не использую d3dcull_none

lellel
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 207
Зарегистрирован: 19.12.2007 (Ср) 22:07
Откуда: Долгопрудный

Re: Проблема с Shadow Volume

Сообщение lellel » 24.08.2008 (Вс) 20:49

а ты пробовал в моем исходнике это сделать?
вот что я сделал:
"открыл" строки в твоем модуле:
d3dDevice.Clear 0, ByVal 0, D3DCLEAR_STENCIL, 0, 1#, 0
d3dDevice.SetRenderState D3DRS_CULLMODE, D3DCULL_CCW
после этого запустил..
короче вот скрины, теперь тень вроде есть, но мне кажется что она неправильная..
123.jpg

верхнее: мне кажется что эту тень не может отбрасывать сфера...
нижнее: почему то иногда наблюдается такие вот искажения..

и еще, весьма падает fps, хотя не скажу что машина у меня особо сильная...
У вас нет доступа для просмотра вложений в этом сообщении.

djalex777
Постоялец
Постоялец
 
Сообщения: 461
Зарегистрирован: 23.03.2006 (Чт) 16:02

Re: Проблема с Shadow Volume

Сообщение djalex777 » 28.08.2008 (Чт) 20:20

В принципе, ты сделал всё правильно. Только вот строку с очисткой stencil не надо раскомментировать. Тебе нужно очищать stencil буфер там же, где ты очищаешь zbuffer и target, то бишь, вначале отрисовки каждого кадра.
Далее, тень получается неправильной потому как FVF твоего объекта не совпадает с загружаемым функцией BuildFromMesh. Для того чтобы всё правильно работало добавь строку после создания объекта
Код: Выделить всё
...
'Тут твоё создание объекта bMesh
Set bMesh = bMesh.CloneMeshFVF(0, D3DFVF_VERTEX, d3dDevice)
...

lellel
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 207
Зарегистрирован: 19.12.2007 (Ср) 22:07
Откуда: Долгопрудный

Re: Проблема с Shadow Volume

Сообщение lellel » 29.08.2008 (Пт) 7:48

то есть тот флаг очистки стенсил буфера можно добавить к двум уже имеюшимся у меня?
а что такое FVF?
сейчас нет доступа к компу, но потом обязательно попробую.. спасибо)

StimorolD3DX
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 293
Зарегистрирован: 03.04.2007 (Вт) 18:19
Откуда: Kiev city

Re: Проблема с Shadow Volume

Сообщение StimorolD3DX » 07.09.2008 (Вс) 14:15

Та че вы паритесь со стенсильными тенями? Я вон выкладывал пример шедоумепа под 8-ой директикс. Осталось только перевести из С++ и вперед.

DirectXManiac
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1543
Зарегистрирован: 03.11.2005 (Чт) 13:32
Откуда: из DirectX SDK

Re: Проблема с Shadow Volume

Сообщение DirectXManiac » 05.01.2009 (Пн) 15:02

Пробовал вчера переводить, не могу вообще понять алгоритма, он не работает... Перевел вроде правильно, но с матрицами и с самим рендером теней в текстуру какая то лажа. Решил для своих карт сделать стенсильные тени, но опять проблема. Кто-то строил волюм из набора вершин без индексов, зная например только ребра. Волюм построил нормально, правда не записывал какие front-culled, какие back треугольники, волюм рисуется нормально(если просто его рисовать), но не могу никак понять почему при рисовании теней как положено через стенсил - рисуется какая то фигня вместо тени.
p.s. карты - свой загрузчик worldcraft map. StimorolD3DX - у тебя неправильно грузится геометрия в примере, я писал с нуля свой))) потом как закончу выложу пример)
У вас нет доступа для просмотра вложений в этом сообщении.
#define ROFL 0xDDDD

След.

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

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

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

    TopList  
cron