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

Растеризация треугольников в воксльный грид

Страницы: 1 2 3 Следующая »
#0
3:36, 24 мая 2021

Мне нужно растеризовать треугольники не в 2д изображение, а в 3д грид из вокселей на компут шейдере.
Алгоритм в лоб: "берем AABB треугольника, находим воксели, которые пересекает AABB, перебираем их и проверяем пересечение бокса вокселя с треугольником."
Для тонких длинных треугольников, да которые еще лежат по диагонали - получается, что можем проверить в N^3 больше вокселей, чем необходимо.
Из того что пока нашел сам DDA:
https://github.com/ramakarl/voxelizer/blob/master/main.cpp#L203
Но запихнуть такое в compute проблематично.
Какие еще варианты есть?

#1
(Правка: 6:28) 6:20, 24 мая 2021

MrShoor
почему тебе необходимо именно компьютом? если использовать растеризационный пайплайн, можно просто рендерить, установив zfar/znear как ближнюю/дальнуюю границы среза вокселей, при этом всё автоматически отрежется как надо. рендерить по 8 слоёв за дроколл (или сколько там у тебя рендертаргетов поддерживается одновременно). по крайней мере, вроде, так работал vxgi.

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

#2
10:14, 24 мая 2021

Suslik
> если использовать растеризационный пайплайн, можно просто рендерить, установив
> zfar/znear как ближнюю/дальнуюю границы среза вокселей, при этом всё
> автоматически отрежется как надо
Не отрежется же. Представь треугольник, нормаль плоскости которого ортогональна "view" вектору. Послойно отрендерится 0 пикселей, хотя очевидно, что треугольник пересекает вокслели. Возможно конечно что с консервативной растеризацией всё ок будет, но мне по железу хочется уложиться в аппаратные возможности DX11.

#3
10:47, 24 мая 2021

MrShoor
что по итогу должно содержаться в 3д грид? индексы треугольников?

#4
11:17, 24 мая 2021

Ruslan
> что по итогу должно содержаться в 3д грид? индексы треугольников?
дальше обработка пары воксель-треугольник

#5
(Правка: 11:57) 11:55, 24 мая 2021

MrShoor
> Не отрежется же. Представь треугольник, нормаль плоскости которого ортогональна
> "view" вектору
с чего это? этот треугольник окажется целиком лежащим между znear/zfar плоскостей только одного из слоёв-рендертаргетов. этот способ есичо не я придумал, так с незапамятных времён растеризовали треугольники в воксели для всяких deep depth buffer'ов.

если тебе доступен image load/store, то можно сделать вообще без рендертагетов, а так:
1) ставишь ортогональную камеру, фрастум которой совпадает с твоей воксельной сеткой.
2) ставишь вьюпорт, равный ширине*высоту воксельного объёма
3) отключаешь тест глубины, растеризуешь все треугольники
4) во фрагментном шейдере ты получишь x, y координаты столбика из вокселей, который занимает текущий треугольник. поэтому можно пробежаться циклом по всем занимаемым им вокселям (z-столбику) и сделать с ними что тебе нужно.

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

#6
12:10, 24 мая 2021

Suslik
> с чего это? этот треугольник окажется целиком лежащим между znear/zfar
> плоскостей только одного из слоёв-рендертаргетов
Нет, ты не понял. Представь, что слои рендертаргета у нас по Z. То есть каждый отдельный слой - набор вокселей в плоскости XY. А теперь у нас треугольник, где X скажем некоторая константа:
{0.13, 3, 8}, {0.13, 2, 4}, {0.13, 0, -5}
То есть проекция треугольника вырождается в полоску шириной в 0. Растеризатор будет красить только те пиксели, центры (семплы) которых лежат в треугольнике, но ни один семпл не будет лежать в нём.

> так с незапамятных времён растеризовали треугольники в воксели для всяких deep
> depth buffer'ов.
Есть пример? Потому что пока я вижу, что техника не сработает.

Suslik
> 4) во фрагментном шейдере ты получишь x, y координаты столбика из вокселей,
> который занимает текущий треугольник. поэтому можно пробежаться циклом по всем
> занимаемым им вокселям (z-столбику) и сделать с ними что тебе нужно.
Да говорю же, без консервативной растеризации не взлетит. Потому что для треугольника у тебя может быть 0 инвокейшнов в фрагментный шейдер. Но идею я понял, спасибо.

#7
12:21, 24 мая 2021

MrShoor
> дальше обработка пары воксель-треугольник

У меня была задача собрать в буфер индексы треугольников прошедших тест на пересечение с каждым вокселем в 3д грид (для последующих тестов луча с треугольниками)
В первом буфере складывал все треугольники прошедшие тест на пересечение с каждым вокселем: voxel#0(список индексов треугольников пересекающихся с данным вокселем), voxel#1, voxel#2, voxel#n
во второй буфер складывал смещения начала списка индексов для каждого вокселя из первого буфера (смещение указывает на первый индекс треугольника в конкретном вокселе)
делал все в лоб на компут шейдере за два прохода (так как не придумал, как все быстро реализовать через растеризацию и без сортировок, и что бы пустые воксели не занимали память). В первом проходе считал количество треугольников прошедших тест на пересечение с каждым вокселем, на втором проходе все тоже самое но уже заполнял буфер зная, куда пишу и сколько, не выходя за диапазон).
Поэтому и уточнил, похожая ли у тебя задача или нет(возможно в твоем случае достаточно просто определить пустой воксель или нет), так как на будущее хотелось бы найти более оптимальное решение.

#8
12:27, 24 мая 2021

Ruslan
> Поэтому и уточнил, похожая ли у тебя задача или нет(возможно в твоем случае
> достаточно просто определить пустой воксель или нет), так как на будущее
> хотелось бы найти более оптимальное решение.
Ок, для каждого вокселя у меня есть источники света, которые на него влияют (clustered lighting). Для треугольника мне нужно найти источники света, которые на него влияют, чтобы знать в какие shadow map-ы - его надо растеризовать.

#9
14:17, 24 мая 2021

MrShoor
а, тогда ваш случай проще, очевидно, что Suslik предложил хорошее решение.
>Представь треугольник, нормаль плоскости которого ортогональна "view" вектору. Послойно отрендерится 0 пикселей, хотя очевидно, что треугольник пересекает вокслели.
в этом случае наверное достаточно будет сделать небольшое смещение для вертекса?.

#10
(Правка: 20:50) 20:49, 24 мая 2021

Suslik
Ruslan
Либо я криво объясняю, либо я чего-то не понимаю.
Вот нарисовал "воксельный грид". Изображение слева - то, как будет выглядеть в момент растеризации грид. Изображение справа - вид сбоку просто вам для наглядности. Точки - олицетворяют центры семплов при растеризации.

Объясните мне, как без консервативной растеризации оно хоть раз попадет в пиксельный шейдер?

#11
20:59, 24 мая 2021

>Какие еще варианты есть?
По дистанции от центра треугольника посчитать?!

#12
(Правка: 21:08) 21:07, 24 мая 2021

eDmk
> По дистанции от центра треугольника посчитать?!
Да как посчитать не вопрос, как выбрать только те воксели, которые треугольник цепляет? Вот есть у тебя воксели: 64*64*64
И треугольник с координатами:
{0, 0, 0}, {0, 0.1, 0}, {64, 64, 64}
Это длинный и тонкий треугольник, типа такого:
2 | Растеризация треугольников в воксльный грид
Предлагаешь перебрать 64*64*64=262144 вокселя и проверить дистанцию?

#13
21:28, 24 мая 2021

MrShoor
С трёх сторон растеризуй. Ещё эт, MSAA 8 вруби, такая замена консервы для нищих.

#14
21:48, 24 мая 2021

Battle Angel Alita
> С трёх сторон растеризуй.
Ну растеризовал:
3 | Растеризация треугольников в воксльный грид
Ни один семпл не пострадал. Может сторон недостаточно?

> Ещё эт, MSAA 8 вруби, такая замена консервы для нищих.
Ясссно

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