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

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

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

MrShoor
> перебрать 64*64*64=262144 вокселя
Да не. Отталкиваться от геометрии треугольника.
Вроде такого:

+ Показать

Каждую точку помещаем в список индексов.
У меня так сделано:

+ Показать

Работает шустро очень даже на CPU ...
Только я использую для сглаживания.

#16
22:13, 24 мая 2021

eDmk
> Да не. Отталкиваться от геометрии треугольника.
Как именно отталкиваться? Есть алгоритм?

#17
(Правка: 22:28) 22:28, 24 мая 2021

MrShoor
> Как именно отталкиваться? Есть алгоритм?
Есть только алгоритм распихивания точек по вокселям.
Для самого треугольника надо придумывать.

Но общий замысел как на рисунке - превратить треугольник
в набор опорных точек с расстоянием меньше половины куба
и пометить нужные воксели. Диаграмма Вороного вряд ли подойдет.
Надо колдовать.

#18
22:39, 24 мая 2021

Можно еще во фрагментом прописать раскидывание точек по кубам.
Т.е. просто индексировать нужные кубы, а потом по величине индекса
вокселизировать или дискардить нужный куб.
Должно получиться достаточно шустро.

#19
22:40, 24 мая 2021

eDmk
> Есть только алгоритм распихивания точек по вокселям.
Ну точки то по вокселям распихать не проблема

> Для самого треугольника надо придумывать.
Собственно об этом и нульпост

#20
5:04, 25 мая 2021

MrShoor #14
такой треугольник и обычной растеризацией в таком случае будет невидим. поэтому если он является частью меша, то вклад в растеризованные пиксели/воксели должны иметь его соседи, а не он сам.

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

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

#21
(Правка: 7:28) 7:25, 25 мая 2021

Suslik
> поэтому если он является частью меша, то вклад в растеризованные
> пиксели/воксели должны иметь его соседи, а не он сам.
Ок. Вот у нас куб, нормали граней которого коллинеарны осям грида. Как передняя и задняя стенка внесет вклад так, чтобы компенсировать отсутсвие боковых стенок?

> если тебе очень хочется, чтобы конкретно растеризовались тонкие треугольники,
> можешь растеризовать дополнительно их рёбра как линии, тогда гарантируется, что
> ты не пропустишь частично перекрытые пиксели/воксели.
Я в общем то раньше описал, что я хочу получить. В вокселях у меня индексы источников света. Я хочу знать какие источники света влияют на треугольник, чтобы знать в какие шедоумапы его дальше рендерить. Дополнительно ребра и линии сюда плохо ложатся.

#22
(Правка: 7:32) 7:31, 25 мая 2021

MrShoor
> Ок. Вот у нас куб, нормали граней которого коллинеарны осям грида. Как передняя
> и задняя стенка внесет вклад так, чтобы компенсировать отсутсвие боковых
> стенок?
этот случай решается либо через растеризацию по трём осям, либо через растеризацию рёбер линиями. от соседей вклад имелся в виду для случаев тонких длинных треугольников как в #14.

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

#23
7:41, 25 мая 2021

Suslik
> ещё учти, что тебе на самом деле не нужно на выходе растеризатора получить
> точное множество вокселей, пересекаемых треугольником.
Да, это само собой. Я сейчас вообще думаю над вариантом: побить все треугольники так, чтобы длина любого ребра не превышала размера вокселя, и гонять bbox-ы

#24
14:43, 25 мая 2021

помню страдал таким же... Я делал проверку небольшую. Расстояние от центра вокселя до плоскости треугольника, то есть если меньше половины размера вокселя то есть потенциальное пересечение. Может быть тебе поможет...

#25
15:10, 25 мая 2021

BANEBYTE
> Расстояние от центра вокселя до плоскости треугольника, то есть если меньше
> половины размера вокселя то есть потенциальное пересечение.
это не только не имеет никакого отношения к проблеме, но ещё и неверно

#26
15:12, 25 мая 2021

Suslik
извиняюсь если неверно... это так из головы...

#27
(Правка: 17:18) 17:18, 25 мая 2021

Что-то намудрили, а решается довольно просто:
1. Геометрический шейдер находит площадь проекции треугольника на 3 плоскости и отдает вариант с наибольшей площадью.
2. Пиксельный шейдер ничего не выводит в RT(RT вообще не биндим), а пишет по своей позиции прямиком в RWTexture3D.
3. Если поддерживается - включаем Conservative Rasterization. Если нет - эмулируем в том же геометрическом шейдере.

#28
23:44, 25 мая 2021

Che@ter
> Геометрический шейдер находит площадь проекции треугольника на 3 плоскости и
> отдает вариант с наибольшей площадью.
Смотрим на нормаль треугольника, какая из трёх компонент больше всех - с той проекции и растеризуем, при таком выборе на один пиксел, вроде, будет не более трёх пересечений.

#29
(Правка: 14:48) 14:42, 29 мая 2021

MrShoor
Навскидку - спроецировать треугольник на коорд плоскость (XY,YZ,XZ), убрав координату с наименьшим абсолютным значением нормали. И попиксельно рендерить этот треугольник на плоскости, добавляя к полученным квадам (границам пикселя) Z
Или отрендерить в текстуру и перевести в кубы, добавив Z из Z-буфера, либо линейной интерполяцией Z вершин
> Не отрежется же. Представь треугольник, нормаль плоскости которого ортогональна "view" вектору
Меняешь view вектор на ось с наименьшим абсолютным значением проекции нормали

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