Russian Qt Forum
Апрель 28, 2024, 22:27 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 2 [3]   Вниз
  Печать  
Автор Тема: Water Mist  (Прочитано 21394 раз)
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #30 : Июль 31, 2013, 20:46 »

Вот примерчик попроще. Как видим, вариации освещенности водопада очень тонкие, вообще-то он белый/серый. Но как только эти вариации убрать и залить все "просто белым" - все впечатление пропадет
Вы бы отключили эти кубы и показали водопад без брызг. Что бы мы визуально это смогли посмотреть.
И еще такой вопрос, а вот для этой картинки сколько используется кубов со стороной 256 точек?
« Последнее редактирование: Июль 31, 2013, 21:15 от Old » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #31 : Август 01, 2013, 08:50 »

Представьте гребень волны, реально мы видим тонкий слой воды, не середину, не тем более заднюю часть гребня мы не видим. Зачем нам рисовать эти точки?
Теоретически экспонента никогда не станет равной нулю, поэтому отсекать по альфе придется. Часто делают примерно так
Код
C++ (Qt)
float AdjustAlpha( float a, float t1 = 0.8f, float t2 = 0.9f )
{
if (a <= t1) return a;
if (a >= t2) return 1.0f;
a = (a - t1) / (t2 - t1);
return t1 + (3 * a * a - 2 * a * a * a) * (1 - t1);  // сглаживаем переход
}
Т.к. рендер выполняется "от ближних к дальним", то если мы установим alpha = 1, задние точки рендериться не будут. Возможен и др подход - вообще не рендерить точки как таковые, а работать непосредственно с лучами. Если интересно расскажу, но в общем это дело техники и к задаче прямого отношения не имеет.

С помощью "плотности куба" можно полностью отбрасывать незаполненные кубы. Например, есть удаленные от капли, с помощью LOD мы решаем, что они находятся в кубе со стороной 32 точки. Плотность такого куба будем минимальной и мы смело сможем отбросить его и эти пару капель. А если дистанция то этих капель будет меньше, размер рассматриваемого куба тоже будет меньше и плотность его будет выше.
Так же при визуализации, эту плотность можно суммировать и останавливать дальнейших ход луча.
Пока не вижу алгоритма/сценария. Есть точка и она находится в main cube. Куб имеет 2 чайлд куба, те своих чайлдов и.т.д. до упора. Известно направление луча на источник света. Ну и что мы должны делать? Кстати а как делить - по пр-ву или по числу точек? (мне кажется по числу лучше)

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

Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #32 : Август 01, 2013, 09:32 »

Есть точка и она находится в main cube. Куб имеет 2 чайлд куба, те своих чайлдов и.т.д. до упора.
Почему два? Их будет 8. Куб разбивается по середине вертикальной и горизонтальной плоскостью, получаем 8 кубов в два раза меньше родительского.

Известно направление луча на источник света. Ну и что мы должны делать?
С помощью октодерева и LOD отбрасываем невидимые данные + минимизируем удаленные, дальше рендерим оставшиеся точки лучом, но только контролируя плотность и если плотность становиться максимальной, то переходим к следующей точке.

Никаких кубов у меня пока нет.
А картинки откуда?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #33 : Август 01, 2013, 09:52 »

Почему два? Их будет 8. Куб разбивается по середине вертикальной и горизонтальной плоскостью, получаем 8 кубов в два раза меньше родительского.
Не уверен в этом, OcTree может быть очень затратным по памяти, в то время как двоичное практически бесплатно. Ладно, это пока не актуально, все равно "кубы"

С помощью октодерева и LOD отбрасываем невидимые данные + минимизируем удаленные, дальше рендерим оставшиеся точки лучом, но только контролируя плотность и если плотность становиться максимальной, то переходим к следующей точке.
Я имею ввиду расчет освещенности одной/заданной точки. Ну спустились по дереву в чайлд куб где находится точка. Дальше что?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #34 : Август 01, 2013, 15:57 »

Не уверен в этом, OcTree может быть очень затратным по памяти, в то время как двоичное практически бесплатно. Ладно, это пока не актуально, все равно "кубы"
Да октодеревья очень затратны к памяти. Да и их целесообразность у меня стала вызывать сомнения, в связи с этим:
Однако см картинку первого поста - вряд ли удастся что-то значительно сэкономить, все "достаточно близко".
Если куб всегда будет полность попадать в фрустум камеры, то нет никакого смысла пытаться что-то отсечь.

Я имею ввиду расчет освещенности одной/заданной точки. Ну спустились по дереву в чайлд куб где находится точка. Дальше что?
Дальше стреляем лучом из каждой точки куба в камеру или объединяем несколько точек в одну, если они удалены.
От источника света идет луч до целевой точки-капли, если луч проходит другие точки, то его интенсивность снижается. А от капли луч идет прямо в камеру. Чем ниже интенсивность, тем более темная капля будет. Как-то так, я не специалист в этом и этим уже очень давно не занимался.

Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #35 : Август 02, 2013, 11:32 »

Сама трассировка - дело нехитрое, напр (псевдокод)

Код
C++ (Qt)
// рекурсивная ф-ция, возвращает true если результат уже достигнут
bool Trace(
   const Node * node,  
   const Point & minP,  // min угол куба  
   const Point & maxP,  // max угол куба  
   Point ray[2] )            // 2 точки луча в кубе
{
if (node->IsLeaf()) {    // у нода нет чилдренов
 ... // накапливаем альфу
 return false;  // или true если альфы хватает (вряд ли)
}
 
Node * child;
Point minP2, maxP2, ray2[2];
 
if (node->IntersChild0(&child, minP, maxP, &maxP2, ray, ray2))  // луч пересекается с первым чайлдом
 if (Trace(child, minP, maxP2, ray2)) return true;
 
if (node->IntersChild1(&child, minP, maxP, &minP2, ray, ray2))  // луч пересекается со вторым
 if (Trace(child, minP2, maxP, ray2)) return true;
 
return false;
}
 
Расписывние внутренностей IntersChild опускаем ввиду его длинности/нудности. Понятно что если куб "полностью заполнен", мы для него просто не создаем chilldren. Но если нет? "Спускаться до упора" явно дороговато. Построение дерева в наших руках, какие решения Вы предлагаете?

Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #36 : Август 02, 2013, 12:24 »

Построение дерева в наших руках, какие решения Вы предлагаете?
Я говорил про то, что если вся сцена (куб 256x256x256) попадает в фрустум камеры, то вообще нет никакого смысла в октодереве. Мы все равно с его помощью не сможем отсечь ни одной точки.
Если это так, то октодерево можно отложить. А еще лучше нарисуйте, как эти куб(ы) с пеной соотносятся с поверхностями воды или скалы. Они как бы лежат на этих поверхностях?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #37 : Август 04, 2013, 10:57 »

1) Само приложение делает просто "партиклы" (желтые) имеющие позицию, скорость, ID и.т.п.
2) Затем к ним лепятся хвосты (на основании вектора скорости) и возможно они размножаются. Это несложно
3) А вот в приложении их надо осветить (последняя картинка, цвет специально циан). Вот это самое сложное
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #38 : Август 04, 2013, 10:58 »

Последняя картинка не влезла, прилагаю
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #39 : Сентябрь 26, 2013, 14:55 »

Пока хромая/косая альфа, сильный алиас + куча др проблем.
Записан
Страниц: 1 2 [3]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.097 секунд. Запросов: 22.