Войти
ПрограммированиеФорумГрафика

Volume Rendering (2 стр)

Страницы: 1 2 3 416 Следующая »
#15
1:30, 27 фев. 2010

Вот непрозрачный шар
Voxel_1 | Volume Rendering
прозрачный реально плоский тока края слабо переходят на нет.
Voxel_2 | Volume Rendering

Для начало надо решить что хотим водить.
Все видели небось рентгеновский снимок- тогда никаких освещений не надо просто по лучу интегрируем плотность.
Если нужно выделить какие нибудь конторы то надо найти способ их описать математически.
типа если плотность <10% то полностью прозрачен
если 10%-60% полупрозрачен
если 60%-100% непрозрачен
и дальше просто трассировкой лучей рисовать + при переходе из одной среды в другую учитывать освещение.
тогда при вращение будут ведны контуры и из за освещение формы.

#16
1:31, 27 фев. 2010

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

#17
1:34, 27 фев. 2010

Я поборол шейдер диффуза, трабл оказался очень плохом поведении Cg при попытке нормализовать маленький вектор. Удивительно, с диффузом выглядит куда приятнее. Старый вольюм не нашёл, остался только заданный аналитически. Это очень хороший случай, в жизни будет хуже:
Изображение

Возникло несколько вопросов:
1) Невооружённым глазом трудно не заметить артефакты - круги, возникающие при линеной интерполяции по достаточно грубой сетке. От них как-то можно избавиться? Они возникают при рендеринге объёма с большим градиентом интенсивности/прозрачности.

2) Чтобы посчитать нормаль, в шейдере я делаю так:

    float step = 1.0 / 60.0;
    float3 gradient = float3(tex3D(volumeTex, currPoint + float3(step, 0, 0)).a - tex3D(volumeTex, currPoint + float3(-step, 0, 0)).a,
                 tex3D(volumeTex, currPoint + float3(0, step, 0)).a - tex3D(volumeTex, currPoint + float3(0, -step, 0)).a,
                 tex3D(volumeTex, currPoint + float3(0, 0, step)).a - tex3D(volumeTex, currPoint + float3(0, 0, -step)).a) * (0.5 / step);
как-то можно сделать то же самое, но нормально? считать на процессору и сувать ещё одну текстуру с нормалью не хочу.

#18
1:39, 27 фев. 2010

RPGman
> Считаешь, что падающий свет рассеивается материалом объема.
> Чем сильнее свет рассеян в предыдущих вокселях на пути луча из источника света,
> тем меньше его долетает до следующих вокселей - они хуже освещены.
> И чем выше значение рассеивания в вокселе, тем большую часть падающего света он
> отразит в камеру, и тем непрозрачнее он становится для света, отраженного в
> камеру более дальними вокселями.
ну смори, вот так я считаю трейс одного рея(папа-код, не пугаемся):

  for(float scale = 0.0; scale < travelDist + 0.01; scale += stepsize)
  {
    colorSample = tex3D(volumeTex, currPoint);
    
    float step = 1.0 / 60.0;
    float3 gradient = float3(tex3D(volumeTex, currPoint + float3(step, 0, 0)).a - tex3D(volumeTex, currPoint + float3(-step, 0, 0)).a,
                 tex3D(volumeTex, currPoint + float3(0, step, 0)).a - tex3D(volumeTex, currPoint + float3(0, -step, 0)).a,
                 tex3D(volumeTex, currPoint + float3(0, 0, step)).a - tex3D(volumeTex, currPoint + float3(0, 0, -step)).a) * (0.5 / step);
    if(length(gradient) > 0.001)//aw, jeez
      gradient = normalize(gradient);
      
    float diffuse = dot(gradient, float3(-1, -1, 0));
    diffuse = clamp(clamp(diffuse, 0.0, 1.0) + 0.4, 0.0, 1.0); //+ambient
    
    colorSample.a *= stepsize * density;
    colorSample.a = clamp(colorSample.a, 0, 1);    
    
    colorSample.rgb *= colorSample.a;
    colorSample.rgb *= diffuse;
    
    accumulatedColor += (1.0 - accumulatedColor.a) * colorSample;
    
    currPoint += deltaPos;
  }
стандартный для forward-trace вольюм рендереров бленд, чем непрозрачнее воксель, тем меньшее влияние окажут следующие за ним на лучше воксели. в принципе, это то и есть, что ты говорил, не?
#19
1:41, 27 фев. 2010

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

>Для начало надо решить что хотим водить.
если б я знал. надо найти ещё какой-то эффект, из-за которого объём будет виден лучше. хотя диффуз меня приятно удивил.

#20
2:12, 27 фев. 2010

Добавил спекуляр. Блин, прикольно! Примерно боевая сцена, такую и предстоит визуализировать(это волновые фронты, если кому интересно):
так было два часа назад:
Изображение
так стало с диффузом:
Изображение
так стало со спекуляром:
Изображение

видео:

#21
2:28, 27 фев. 2010

вопрос про артефакты из #17 поста открыт. при некоторых ракурсах очень сильно раздражают, как быть?

#22
5:54, 27 фев. 2010

Suslik
> как быть?
tricubic interpolation?

#23
8:26, 27 фев. 2010

Со спекуляром очень круто выглядит)

#24
9:24, 27 фев. 2010

Suslik
> вопрос про артефакты из #17 поста открыт. при некоторых ракурсах очень сильно
> раздражают, как быть?
может шум добавить ?

#25
9:52, 27 фев. 2010

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

#26
9:55, 27 фев. 2010

с построением нормали разобрался уже судя по последним скринам?

#27
9:59, 27 фев. 2010

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

#28
14:03, 27 фев. 2010

Suslik
> в принципе, это то и есть, что ты говорил, не?
Если про скаттеринг, то не совсем. Это только луч из камеры, а нужен еще луч из источника света, ослабленный по пути до текущего вокселя.  Два интегрирования в результате. Может, окажется неподъемным.
Да и результат со спекуляром - кул :)

#29
14:04, 27 фев. 2010

RPGman
> ослабленный по пути до текущего вокселя

> Два интегрирования в результате. Может, окажется неподъемным.
разве не аппроксимируется по простому exp( - l * b ), l = длина пробега в материале ?

Страницы: 1 2 3 416 Следующая »
ПрограммированиеФорумГрафика

Тема в архиве.