(Для Alex и не только....)
Для начала:
http://www.geocities.com/andrewvk107/SurfVolum/Pict1.jpg
http://www.geocities.com/andrewvk107/SurfVolum/Pict2.jpg
http://www.geocities.com/andrewvk107/SurfVolum/Pict3.jpg
http://www.geocities.com/andrewvk107/SurfVolum/Pict4.jpg
http://www.geocities.com/andrewvk107/SurfVolum/Pict5.jpg
http://www.geocities.com/andrewvk107/SurfVolum/Shader.zip
SdadowMap генериться для объекта в его обычном состоянии
(объект двусторонний, нормали наружу)
В процессе просчета луч I натыкаеться на P1 (Pict1.jpg)
и не пройдя проверку ( N.I > 0 ) идет дальше.
(вектор I и нормаль N имеют противоположные направления
(всмысле угол меж ними < 90 гр.))
Прверка срабатывает когда I натыкаеться на P2.
(вектор I и нормаль N имеют одинаковые направления
(всмысле угол меж ними > 90 гр.))
Вот тогда и начинеться процесс рэймарша.
В цикле while от точки P2 мы начинаем двигаться вдоль
луча I назад к камере с приращением stepsize
Psamp = Psamp + stepsize * normalize (-I); /* (-I) значит в обратную сторону /*
stepsize * normalize(-I) - float stepsize превращаеться в вектор теперь уже
имеющии направление (в противоположную сторону от I)
В текущей точке Psamp вызываються функции определяющие прозрачность
и цвет в данной точке пространства, которые накапливаються с вычесленными на
предидущем шаге по пока неведомому мне принципу
В конце концов текущая точка Psamp отправляеться на проверку в функцию
shadow:
test = shadow (ShdName,Psamp);
Переменная test (являющаяся условием продолжения цикла while) будет
установлена в 1 - если Psamp внутри объекта или 0 - если Psamp
на поверхности (точка P1 на картинке) или немного вылезла за пределы.
Грубо говоря shadow map несет в себе информацию о координатах
всех возможных точек P1. Еще грубее:
отвечает на вопрос "Какие точки вдоль I начиная от P2 лежат "в тени" P1"
При test = 0 рэймарш прекращаеться и рэндэру возвращаеться накопленный
цвет и прозрачность.
Вот примитивная реализация:
>surface
>VolumSurf ( string ShdTex = "";
> float stepsize = 0.3;
> )
> {
> Ci = Oi = 0.0;
> varying float test = 1;
>
> if (I.N > 0)
> {
> point Psamp = P;
> vector Imarch = normalize (-I);
>
> if (ShdTex != "")
> {
> while ( test == 1)
> {
> Ci += 0.001;
> Oi += 0.001;
> Psamp += stepsize * Imarch;
> test = shadow (ShdTex, Psamp);
> }
> }
> }
> }
В ARmane (насколько я знаю) предлагают другой способ:
Использовать функцию Raysphere для определения
сегмента через который пройдет рэймарш.
Но если посмотреть на (Pict2.jpg)
то станет ясно что если объект далек от сферы то в большенстве
случаев имеет место быть ПЕРЕрэймарш причем в данном случае
кое где даже очень ПЕРЕ.
Отсюда увеличени времени просчета которое к тому же дает
неверный результат.
Существуют ситуации когда оба способа гонят
(Pict3)
Пустота будет воспринята как волум причем дважды.
У моего способа есть недостаток:
Когда камера или объект движуться то shadow map нужно
генерить для каждого кадра. Но как показал эксперимент
это всеравно быстрее и правильнее чем raysphere
(в случае шибко несферического объекта)
Это проверенный факт.
Я тут слил перезаточенный shadowedclouds.sl Ларика Грыця
В слиме к камере приатачь shadow генератор,
установи резолюшн шэдов мапы больше чем максимальная у камеры.
Выясни какое имя он будет генерить и подставь его в
шейдер. Например для анимации:
e:/projectsm/volumtest/rmantex/shd/test.camerashape1.shd.$F4.tex
Для статики:
e:/projectsm/volumtest/rmantex/shd/test.camerashape1.shd.tex
Я не стал извращаться с функцией прозрачности и тем более цвета
а оставил как есть. Потому что...... (САМОЕ СМЕШНОЕ)
Качество сильно зависит от расстояния до объекта и
его размеров на картинке. Но это уже неважно поскольку.....
Что будет когда камера войдет внутрь объекта?
НИХРЕНА!!!!
Внутренняя стенка станет границей тени а маршировать мы будем
от нее. Тоесть пройдет лиш 1 шаг так как test изначально
установлен 1. На втором шаге он обратиться в 0.
Хотя если заходы внутрь не предусмотрены то подобрав
нормальную фрактальную функцию для прозрачности
можно добиться весьма приличных результатов.
Я тут отрэндерил облет вокруг облака.
Ощущение волума потрясное.
Запостить авишку пока несмог - связь дерьмо.
А теперь о главном.
Кажеться мне пришла в голову убойная идея решающая
многие проблемы.
Пиксаровский tx формат несет в себе матрицу трансформа
точки P в пространство той камеры с которой это текстура делалась.
Посмотри на Pict4.jpg, Pict5.jpg и почитай риспек 3.2
про функцию textureinfo.
Вокруг объекта делаем "виртуальный" куб из 6 ортогональных
камер прилинкованых (в смысле он их Parent (если объект движеться))
к объекту. Нужно ли в случае движущегося объекта заново генерить
мапы я пока не въехал. Возможно можно обойтись одним единственным разом!!!
Если объект деформиться то естественно надо.
Генерим с них шэдов мапы (как для поинт лайта только не наружу а внутрь)
Делаем точно такой же рэймарш только проверка на тень сожнее:
Для каждой шэдов мапы
с помощью матрицы полученой из функции textureinfo
поочередно трансформируем Psamp
в пространство той камеры с которой эта мапа генерилась
и если если все 6 вызовов shadow вернут 1 значит 100% точка лежит
внутри объекта. Если хотябы одна вернет 0 значит либо вышли либо
в "дырке от бублика".
На Pict4.jpg нижняя
камера зафиксировала бы отсутствие тени.
Вопрос с камерой внутри автоматически отпадает потому как тени теперь
не привязаны к рэндэркамере.
Но все это еще надо проверить.
Короче неделька обещает быть веселой...когдаж работать то?
Для начала:
http://www.geocities.com/andrewvk107/SurfVolum/Pict1.jpg
http://www.geocities.com/andrewvk107/SurfVolum/Pict2.jpg
http://www.geocities.com/andrewvk107/SurfVolum/Pict3.jpg
http://www.geocities.com/andrewvk107/SurfVolum/Pict4.jpg
http://www.geocities.com/andrewvk107/SurfVolum/Pict5.jpg
http://www.geocities.com/andrewvk107/SurfVolum/Shader.zip
SdadowMap генериться для объекта в его обычном состоянии
(объект двусторонний, нормали наружу)
В процессе просчета луч I натыкаеться на P1 (Pict1.jpg)
и не пройдя проверку ( N.I > 0 ) идет дальше.
(вектор I и нормаль N имеют противоположные направления
(всмысле угол меж ними < 90 гр.))
Прверка срабатывает когда I натыкаеться на P2.
(вектор I и нормаль N имеют одинаковые направления
(всмысле угол меж ними > 90 гр.))
Вот тогда и начинеться процесс рэймарша.
В цикле while от точки P2 мы начинаем двигаться вдоль
луча I назад к камере с приращением stepsize
Psamp = Psamp + stepsize * normalize (-I); /* (-I) значит в обратную сторону /*
stepsize * normalize(-I) - float stepsize превращаеться в вектор теперь уже
имеющии направление (в противоположную сторону от I)
В текущей точке Psamp вызываються функции определяющие прозрачность
и цвет в данной точке пространства, которые накапливаються с вычесленными на
предидущем шаге по пока неведомому мне принципу
В конце концов текущая точка Psamp отправляеться на проверку в функцию
shadow:
test = shadow (ShdName,Psamp);
Переменная test (являющаяся условием продолжения цикла while) будет
установлена в 1 - если Psamp внутри объекта или 0 - если Psamp
на поверхности (точка P1 на картинке) или немного вылезла за пределы.
Грубо говоря shadow map несет в себе информацию о координатах
всех возможных точек P1. Еще грубее:
отвечает на вопрос "Какие точки вдоль I начиная от P2 лежат "в тени" P1"
При test = 0 рэймарш прекращаеться и рэндэру возвращаеться накопленный
цвет и прозрачность.
Вот примитивная реализация:
>surface
>VolumSurf ( string ShdTex = "";
> float stepsize = 0.3;
> )
> {
> Ci = Oi = 0.0;
> varying float test = 1;
>
> if (I.N > 0)
> {
> point Psamp = P;
> vector Imarch = normalize (-I);
>
> if (ShdTex != "")
> {
> while ( test == 1)
> {
> Ci += 0.001;
> Oi += 0.001;
> Psamp += stepsize * Imarch;
> test = shadow (ShdTex, Psamp);
> }
> }
> }
> }
В ARmane (насколько я знаю) предлагают другой способ:
Использовать функцию Raysphere для определения
сегмента через который пройдет рэймарш.
Но если посмотреть на (Pict2.jpg)
то станет ясно что если объект далек от сферы то в большенстве
случаев имеет место быть ПЕРЕрэймарш причем в данном случае
кое где даже очень ПЕРЕ.
Отсюда увеличени времени просчета которое к тому же дает
неверный результат.
Существуют ситуации когда оба способа гонят
(Pict3)
Пустота будет воспринята как волум причем дважды.
У моего способа есть недостаток:
Когда камера или объект движуться то shadow map нужно
генерить для каждого кадра. Но как показал эксперимент
это всеравно быстрее и правильнее чем raysphere
(в случае шибко несферического объекта)
Это проверенный факт.
Я тут слил перезаточенный shadowedclouds.sl Ларика Грыця
В слиме к камере приатачь shadow генератор,
установи резолюшн шэдов мапы больше чем максимальная у камеры.
Выясни какое имя он будет генерить и подставь его в
шейдер. Например для анимации:
e:/projectsm/volumtest/rmantex/shd/test.camerashape1.shd.$F4.tex
Для статики:
e:/projectsm/volumtest/rmantex/shd/test.camerashape1.shd.tex
Я не стал извращаться с функцией прозрачности и тем более цвета
а оставил как есть. Потому что...... (САМОЕ СМЕШНОЕ)
Качество сильно зависит от расстояния до объекта и
его размеров на картинке. Но это уже неважно поскольку.....
Что будет когда камера войдет внутрь объекта?
НИХРЕНА!!!!
Внутренняя стенка станет границей тени а маршировать мы будем
от нее. Тоесть пройдет лиш 1 шаг так как test изначально
установлен 1. На втором шаге он обратиться в 0.
Хотя если заходы внутрь не предусмотрены то подобрав
нормальную фрактальную функцию для прозрачности
можно добиться весьма приличных результатов.
Я тут отрэндерил облет вокруг облака.
Ощущение волума потрясное.
Запостить авишку пока несмог - связь дерьмо.
А теперь о главном.
Кажеться мне пришла в голову убойная идея решающая
многие проблемы.
Пиксаровский tx формат несет в себе матрицу трансформа
точки P в пространство той камеры с которой это текстура делалась.
Посмотри на Pict4.jpg, Pict5.jpg и почитай риспек 3.2
про функцию textureinfo.
Вокруг объекта делаем "виртуальный" куб из 6 ортогональных
камер прилинкованых (в смысле он их Parent (если объект движеться))
к объекту. Нужно ли в случае движущегося объекта заново генерить
мапы я пока не въехал. Возможно можно обойтись одним единственным разом!!!
Если объект деформиться то естественно надо.
Генерим с них шэдов мапы (как для поинт лайта только не наружу а внутрь)
Делаем точно такой же рэймарш только проверка на тень сожнее:
Для каждой шэдов мапы
с помощью матрицы полученой из функции textureinfo
поочередно трансформируем Psamp
в пространство той камеры с которой эта мапа генерилась
и если если все 6 вызовов shadow вернут 1 значит 100% точка лежит
внутри объекта. Если хотябы одна вернет 0 значит либо вышли либо
в "дырке от бублика".
На Pict4.jpg нижняя
камера зафиксировала бы отсутствие тени.
Вопрос с камерой внутри автоматически отпадает потому как тени теперь
не привязаны к рэндэркамере.
Но все это еще надо проверить.
Короче неделька обещает быть веселой...когдаж работать то?