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

Тест видимости.

Страницы: 1 2 3 4 5 6 Следующая »
#0
16:05, 27 апр. 2021

Мне понадобилось перед рендером проверить видим ли данный предмет.
Скажем предмет описывается его ААББ кубиком и положением в пространстве, предметы разбросаны в пространстве случайным образом. Мне нужно составить список предметов которые видимы с данного положения, т.е. не полностью закрыты другими предметами.
Что-то я не соображу как это сделать малой кровью.


#1
16:16, 27 апр. 2021

ключевая фраза "Occlusion Query" может сузить поиск

#2
16:41, 27 апр. 2021

kkolyan
> Occlusion Query
У него накладные расходы очень большие, им надо что-то реально тяжелое откуливать, иначе мы получим фреймдроп. Есть дополнение чтобы получать запрос на видимость асинхронно (conditional rendering)но, если я правильно помню, там замораживаются команды на отрисовку (то есть, набивка данных один черт проходит)

#3
(Правка: 16:48) 16:43, 27 апр. 2021

Frustum Culling + Occlusion Query. Но это техники для DX11 и ниже. Может щас что-то новое есть.
https://docs.unrealengine.com/en-US/RenderingAndGraphics/Visibili… ng/index.html
Или быстрее вообще без Occlusion Query.
https://vkguide.dev/docs/gpudriven/compute_culling/

#4
(Правка: 18:12) 17:17, 27 апр. 2021

lookid
С фрустумом-то понятно, это я естественно делаю, но определение глубины на шейдере (compute culling) похоже это то, что нужно. Насколько я понял там надо будет сделать текстуру глубины с мипами.  Будет отставание на 1 кадр, но это я переживу. Надо подумать как это на HLSL реализовать.

Вот тут есть неплохое описание: https://interplayoflight.wordpress.com/2017/11/15/experiments-in-… mment-page-1/

#5
(Правка: 19:00) 18:29, 27 апр. 2021

Я тут вот что придумал, может бредово но вроде должно работать:
Делается буфер (текстура) размером в максимальное количеству обьектов. Ну скажем 128х128, т.е зарезервировано для 16К обьектов. Более чем достаточно.
После основного рендера выводится картинка в низком разрешении с кубиками ААББ. В шейдер передается индекс каждого обьекта. На пиксельном шейдере в текстуру по адресу определяемому индексом пишется 1. После окончания рендера текстура читается. Теперь CPU знает - если значение по индексу 1, то предмет потенциально виден. Если ноль - его точно не видно.
Хм... Ну тоже будет отставание на один кадр, но вроде должно работать.
Что скажете?

#6
23:35, 27 апр. 2021

san
> Я тут вот что придумал, может бредово но вроде должно работать:
> Делается буфер (текстура) размером в максимальное количеству обьектов. Ну
> скажем 128х128, т.е зарезервировано для 16К обьектов. Более чем достаточно.
> После основного рендера выводится картинка в низком разрешении с кубиками ААББ.
> В шейдер передается индекс каждого обьекта. На пиксельном шейдере в текстуру по
> адресу определяемому индексом пишется 1. После окончания рендера текстура
> читается. Теперь CPU знает - если значение по индексу 1, то предмет
> потенциально виден. Если ноль - его точно не видно.
> Хм... Ну тоже будет отставание на
У меня давно была идея, рендерить оклюжен квери в мелкое окошко, но не реализовал. Кой кто пугал что точность будет говно, и так далее. А так, я получал хоть какойто буст на форвард, когда было более 40 примерно лайтов в кадре (причем скорость роняли не тени (а у меня стенцил волумы), а проход освещения.))) Так то у меня свет откулливается по фрустому и пвс (ку2 бсп). Мой опыт использования оклюжен квери, по большому - негативный. Причем - проблема даже не в синхонизации...

#7
(Правка: 3:31) 3:23, 28 апр. 2021

san
> После основного рендера выводится картинка в низком разрешении с кубиками ААББ.
Что из себя представляют эти кубики ААББ? Это Bounding Box объекта?
Это важная информация, потому что о неё зависит ответ на вопрос:
> Что скажете?
Возможные ответы:
1. Говно
2. Нерабочее говно

p.s. А говно потому что давно уже есть вот это:
https://docs.microsoft.com/en-us/windows/win32/direct3d12/predication-queries
https://docs.microsoft.com/en-us/windows/win32/api/d3d12/nf-d3d12… etpredication

#8
5:35, 28 апр. 2021

MrShoor
ААББ это Bounding Box. То, что "говно" пока спорить не готов, не тестировал, хотя "говно" похоже рабочее. По крайней мере не вижу почему это не будет работать.  Насколько быстро - другой вопрос.
Вывод нескольких тысяч кубиков по идее очень быстрая операция, пиксельный шейдер примитивный, там даже атомарнось не нужна. Вычитать 16 К интов по PCIe вроде тоже проблем не составит.
Разумеется если есть готовая функция то нет смысла огород городить. Спасибо, почитаю что Микрософт предлагает. Если можно получить аналогичный результат без доморощенных алгоритмов то я только за.

#9
(Правка: 6:32) 6:29, 28 апр. 2021

san
> ААББ это Bounding Box

> хотя "говно" похоже рабочее. По крайней мере не вижу почему это не будет
> работать.
Мимо.

+ Показать

> Вычитать 16 К интов по PCIe вроде тоже проблем не составит.
Вот только сначала придется ждать, когда же GPU наконец закончит отрисовку.

#10
(Правка: 7:48) 7:22, 28 апр. 2021

MrShoor
>Bounding Box большой сферы полностью закрывает маленкую сферу вмесе с её Bounding Box-ом. По твоему алгоритму - мы не увидим маленькую сферу, хотя должны.
Да,  в этом случае вариант с кубиками будет лажать. Можно конечно рендерить реальные обьекты, тогда все будет работать корректно, но это медленнее.  Но в моем случае есть одна специфика - у меня все обьекты или кубические или близко к тому (это здания). Сам каркас здания проблем не вызывает, но там куча мелких деталей в виде оконных переплетов, всякoй лепнины, лесенок и т.д. Из-за них количество вертексов увеличивается в несколько сотен раз, но они все мелкие, т.е. ими можно пренебречь при аппроксимации кубиками. Скажем сейчас я рихтую домик где 200.000 трианглов, но фактически это кубик на 8 вершин.

>Вот только сначала придется ждать, когда же GPU наконец закончит отрисовку.
Я уже обьяснял что в случае VR это не проблема. Рендер жестко синхронизирован с частотой хдедсета и мне в любом случае придется ждать аналога vsync от хедсета. Чтение 16 КБ при скорости передачи PCIe в 1000 МБ/сек  займет несколько микросекунд. Ну пусть 100 мкс если со всеми накладными расходами. Я не настаиваю на данном методе если есть лучшие, просто я не нашел достаточно простой реализации, а тут вроде все элементарно.

#11
9:10, 28 апр. 2021

barnes
> Причем - проблема даже не в синхонизации...

а в чём?

#12
10:07, 28 апр. 2021

https://gamedev.ru/code/articles/FrustumCulling
https://gamedev.ru/code/articles/Software_occlusion

#13
11:00, 28 апр. 2021

innuendo
> а в чём?
это риторический вопрос.....

#14
(Правка: 17:04) 17:01, 28 апр. 2021

В OpenGL есть функция glRenderMode.
Вероятнее всего такие есть и в DirectX и в Vulkan...

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

есть ещё вариант вручную всё делать. )))

san
> Да, в этом случае вариант с кубиками будет лажать. Можно конечно рендерить
> реальные обьекты, тогда все будет работать корректно, но это медленнее. Но в
> моем случае есть одна специфика - у меня все обьекты или кубические или близко
> к тому (это здания). Сам каркас здания проблем не вызывает, но там куча мелких
> деталей в виде оконных переплетов, всякoй лепнины, лесенок и т.д. Из-за них
> количество вертексов увеличивается в несколько сотен раз, но они все мелкие,
> т.е. ими можно пренебречь при аппроксимации кубиками. Скажем сейчас я рихтую
> домик где 200.000 трианглов, но фактически это кубик на 8 вершин.
ну разбей этот домик ещё на "кубики", либо в зависимости от расстояния на большее-меньшее кол-во (если это возможно), либо просто на несколько "кубиков", а потом рассматривай только те "кубики" которые попали в кадр.

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