Suslik
> да просто шедоумеп строю тоже со своим transfer function, более размытым, чем
> тот, который используется для рендера геометрии. это немного фейк, но выглядит,
> вроде, норм.
норм, норм... периодичность убита до неразличимой практически...
Suslik
> это, очевидно, плавно изменяющаяся transfer function
Функция хэвисайда, говорят, имеет разрыв
- можно взять разрывную функцию хевисайда
- а можно взять непрерывную функцию?
- конечно, можно, достаточно заменить функцию хевисайда на любую непрерывную
- но ведь функция хевисайда имеет рызрыв
*suslik knocked out*
Suslik
> - можно взять разрывную функцию хевисайда
> - а можно взять непрерывную функцию?
> - конечно, можно, достаточно заменить функцию хевисайда на любую непрерывную
> - но ведь функция хевисайда имеет рызрыв
> *suslik knocked out*
Ну если можно взять любую непрерывную - какой смысл в хевисайде ?
такой, что изоповерхность, которая соответствует heavyside transfer function иногда более наглядна, чем непрерывное распределение плотности?
Suslik
> иногда более наглядна, чем непрерывное распределение плотности?
В чём это выражается ? Картинки для сравнения желательны
Еще раз хотел бы поднять эту тему. Наконец то появилось время вновь заняться Volume рендерингом. Первое что хотелось бы сделать это по нормальному посчитать нормали. Сейчас они считаются как градиент перепада прозрачности по методу который описал Suslik в начальных постах:
vec3 normal = vec3(texture3D(VolumeTexture, P - vec3(stepsize, 0, 0)).a - texture3D(VolumeTexture, P + vec3(stepsize, 0, 0)).a, texture3D(VolumeTexture, P - vec3(0, stepsize, 0)).a - texture3D(VolumeTexture, P + vec3(0, stepsize, 0)).a, texture3D(VolumeTexture, P - vec3(0, 0, stepsize)).a - texture3D(VolumeTexture, P + vec3(0, 0, stepsize)).a);
Перечитывая тему я наткнулся на совет по использованию нормалей Собеля. Но к сожалению из-за не очень хорошей базы по математике я из разговора и ссылок уважаемых гуру ничего не понял. Может кто-нибудь помочь и на пальцах объяснить суть подсчета нормалей Собеля для объема. Заранее очень благодарен.
Нормали по собелю - это просто более широкий шаблон для расчёта нормали. Грубо говоря, ты используешь больше точек, чтобы лучше аппроксимировать нормаль. Сейчас на нормаль и без того уходит больше выборок из текстуры, чем на всё остальное, так что я бы особо не увлекался дальнейшим увеличением этого числа выборок.
Suslik сейчас у меня есть некий запас по производительности так что если эти нормали просадят ее не более чем процентов на 15-20, то не страшно. Кстати а в твоем супер-мега рендере как нормали считаются? Если это не секрет конечно )
Насчет производительности заметил что ее больше убивает векторное умножение двух векторов при расчете освещения нежели выборка из текстуры.
pascal.ilya
> Насчет производительности заметил что ее больше убивает векторное умножение
> двух векторов при расчете освещения нежели выборка из текстуры.
Дай угодаю, NVIDIA ? :)
innuendo
Она самая - GTX 480. А есть какие нибудь хитрые методы оптимизации?
pascal.ilya
> Насчет производительности заметил что ее больше убивает векторное умножение двух векторов при расчете освещения нежели выборка из текстуры.
думаю, ты что-то делаешь не так, потому что выборка из текстуры - куда более дорогая операция, чем несколько умножений. у меня конечно-разностная аппроксимация градиента откушивает добрые 50% от общей производительности. условно.
где ж тебе кстати векторное произведение в освещении-то понадобилось?
> Кстати а в твоем супер-мега рендере как нормали считаются?
примерно так же, как три поста выше. как альтернативный вариант можно использовать ещё одну трёхмерную текстуру с предрасчитанными нормалями - это существенно быстрее, но будут появляться своеобразные артефакты интерполяции таких нормалей. посмотри, может тебе даже это и нужно.
Suslik
Ну мне бы для начала неплохо было бы понять как вообще улучшить нормали, пусть даже они и будут хранится в отдельной текстуре. К сожалению мне фразы типа "конечно-разностная аппроксимация" мало что говорят. Насколько я понял надо взять как бы куб 3х3х3 в котором записаны определенные числа, затем последовательно пройтись по всем значениям куба в котором записаны данные, так что элемент данных стал центральным для этого куба 3х3х3. Далее нормаль считается по какой то хитрой формуле относительно получившегося куба и это значение пишется в новую 3D текстуру. Я правильно понимаю? Соответственно встает вопрос по какой формуле считается нормаль и какими числами заполнять куб 3х3х3.
Правка: И если использовать еще одну 3D текстуру ведь получается что производительность даже возрастет? Ведь надо будет сделать всего лишь 2 выборки? Одну из текстуры данных, а одну из текстуры нормалей.
pascal.ilya
> Правка: И если использовать еще одну 3D текстуру ведь получается что
> производительность даже возрастет? Ведь надо будет сделать всего лишь 2
> выборки? Одну из текстуры данных, а одну из текстуры нормалей.
производительность возрастёт, но добавятся своеобразные артефакты интерполяции по этой текстуре. попробуй.
что такое конечно-разностная аппроксимация. представь у тебя задана некоторая плотность p(x, y, z). тебе нужно получить нормаль. пусть нормаль - это градиент этой функции. точное значение градиента нам не известно, так как не известен точный вид функции p(x, y, z), но мы этот градиент в каждой точке можем примерно посчитать, посчитав значение в нескольких точках, близких к ней. приближение точного значения градиента некоторой формулой, зависящей от значений функций в определённых соседних точках - это и есть конечно-разностная аппроксимация. то, как расположены дополнительные точки(то есть какие брать дополнительные текстурные выборки) называется шаблоном конечно-разностной аппроксимации. вот тот шаблон, что использовал я - шеститочечный, так как нужно сделать шесть выборок, чтобы аппроксимировать трёхмерный градиент. шаблон собеля - 27 точечный. очевидно, полученная аппроксимация градиента будет лучше совпадать с его реальным значением, но это более чем в 4 раза больше выборок.
Тема в архиве.