u960
Фрустум куллинг - это не "типо рейкастинга в 3д". Фрустум куллинг отсекает все, что не попадает в пирамиду видимости камеры, но он не учитывает, виден ли объект(не перекрыт ли он другим, попавшим в пирамиду видимости, объектом).
> Каким способом лучше отсекать?
u960, отсекать иерархический квадтри, либо даже просто грид через FC.
> топ-даун
Если камера сверху и объектов на уровне меньше, чем сотни тысяч - то даже просто Frustum Culling легко всё сделает. Если их сотни тысяч/миллионы - можно сделать grid, отсекать его через Frustum Culling и уже только прошедшие отcечение "ячейки" куллить пообъектно тем же самым Frustum Culling
> Всё равно ничего не понял
Кратко:
- фрусту-куллинг занимается тем, что бы отсечь то, что не попадает в камеру
- оккулюжен-куллинг потом отсекает то, что попадает в камеру, но при этом, например, загорожено другими объектами
- порталы - они в основном для закрытых помещений (условно говоря - отсекают по "комнатам"). так же порталы удобны когда игра, скажем, FPS но внутри каньонов (на макушки гор забраться нельзя) - получаются те же самые "комнаты" но огромного размера
- есть ещё миллион алгоритмов и большинство из них не заменяют, а дополняют друг-друга.
Сответственно, можно, напрмиер, сделать так:
- фрустум-куллинг отсекает всё что не попало в камеру
- среди этого находим порталы и по ним отсекаем внутренние части (комнаты) помещний внутри видимых в камеру домов
- а в помещениях, например, можно использовать BSP или что-то ещё
Но, как правило, хватает самого простого - фрустум-куллинга, всё остальное имеет смысл делать только когда становится понятно, что иначе никак. В общем, если у тебя сейчас стоит вопрос в выборе - то советую сделать F/C, посмотреть на его работу и, 90% вероятность, что большего тебе и не понадобится ;-)
u960
Frustum culling:
RayCasting:

> Сейчас загружаю уровень целиком, одна сетка это пол, вторая сетка это стены.
u960, сколько там поликов в них? 50 млн что ли? Какое целевое железо?
Если железо нормальное и поликов не десятки миллионов - то можно и не париться вообще, просто брать и рисовать.
> А потом расставляются двери, немного мебели и так далее
FC будет норм.
zombihello
А ты как поступаешь с ModelView-матрицей - вычисляешь пирамиду для каждого объекта или как? У каждого же объекта своя матрица трансформаций...
Или это только для LookAt? И как ты проверяешь на видимость VBO?
Daniil Petrov
> У каждого же объекта своя матрица трансформаций...
BoundingBox/BoundingSphere должны уже быть пересчитаны с учетом WorldMatrix для объекта
>И как ты проверяешь на видимость VBO?
BoundingBox строится по вершинам VBO.
Daniil Petrov
> А ты как поступаешь с ModelView-матрицей - вычисляешь пирамиду для каждого
> объекта или как?
Я вычисляю пирамиду один раз используя View и Projection матрицы
> У каждого же объекта своя матрица трансформаций...
> Или это только для LookAt?
у меня BoundingBox уже пересчитан с учетом матрицы трансформации
> И как ты проверяешь на видимость VBO?
У меня BoundingBox описывает геометрию объекта, что упрощает проверку на видимость (8 вершин против N вершин).
А проверку видимости я делаю по формуле вычисления расстояния точки до плоскости [ A*x + B*y + C*z + D ]
( Если расстояние положительно, значит, точка лежит перед плоскостью, отрицательна – значит за плоскостью. )
Где A, B, C, и D - четыре числа, которые определяют плоскость и X, Y, и Z - координаты точки.
Делал по уроку от NeHe Ссылка
Если что, то вот код отвечающий за обновление фрустума и проверку видимости Ссылка
zombihello
Ну я вот тоже его урок переделал:
Пока ещё не проверял. Позже хотя бы на одну вершину проверю.
Не знаю только пока как для каждого бокса или сферы с трансформациями быть :) но у тебя код получше проработан, чем мой!
> у меня BoundingBox уже пересчитан с учетом матрицы трансформации
А это как?
zombihello
На точке проверил, нормально работает:
Daniil Petrov
> но у тебя код получше проработан, чем мой!
:D уверен? Как по мне +/- твой и мой код одинаковый (небольшие различия только)
Daniil Petrov
> А это как?
По сути пока этого в движке нету, так как модели не трансформируются (пока это не надо), а
браши уровня уже находятся в мировой СК с учетом трансформации.
Но в теории это звучит как-то так: вершины BoundingBox'a обновляются с помощью матрицы трансформации.
вот пример псевдо кода:
void UpdateBoundingBox(glm::mat4 Transform ) { //Vertexs - массив вершин типа glm::vec3 (их всего 8 у BoundingBox'a) //Transform - матрица трансформации объекта for ( int i = 0; i < 8; i++ ) Vertexs[i] *= Transform; // ну или примерно так, еще не проверял }
Понимаю что объяснил коряво, но как-то так (у меня всегда был "талант" объяснения )) )
> А это как?
Daniil Petrov, берёшь OBB, трансформируешь его его же мировой матрице - и получаешь его OBB в пространстве мира. Для статической геометрии, которой обычно 95% игрового мира - оно будет константным и обновлять его больше не надо.
P/S Я у себя считаю вообще баундинг-сферами - проще код, быстрее работает, но менее точно (но и у нас и объектов иногда бывает по 100к и больше).
zombihello
> Как по мне +/- твой и мой код одинаковый
Я не допёр, что после вычисления каждой плоскости, идёт нормализация :)
> Но в теории это звучит как-то так: вершины BoundingBox'a обновляются с помощью матрицы трансформации.
Примерно так - http://www.mbsoftworks.sk/index.php?page=tutorials&series=1 - уроки 18, 19? Я сам ещё их не штудировал.
slava_mib
> берёшь OBB, трансформируешь его его же мировой матрице - и получаешь его OBB в пространстве мира.
При загрузке моделей?
> Я у себя считаю вообще баундинг-сферами - проще код, быстрее работает, но менее точно
Сделаю проверку и сфер, и боксов, а там уже буду плясать по ситуации.
Daniil Petrov
> Примерно так - http://www.mbsoftworks.sk/index.php?page=tutorials&series=1 -
> уроки 18, 19? Я сам ещё их не штудировал.
Так там, как я понял, идет выбор объекта мышкой, а не обновления вершин BoundingBox'a
(я статью не читал, посмотрел демку только)
Тебе не понятно как обновить BoundingBox с учетом трансформации объекта? Если да, то вершины BoundingBox'a
обновляются так же само как ты, например, перемещаешь вершины модели в шейдере
(умножением вершины в локальной СК на матрицу трансформации)
Daniil Petrov
> При загрузке моделей?
По началу да, а если модель сместилась, повернулась и т.п, то так же само обновляешь. (если я правильно понял мысль slava_mib)
Я ведь правильно понял OBB - это ограничивающее тело?
> При загрузке моделей?
Daniil Petrov, при загрузке моделей считаешь для каждой из них AABB. А при добавлении на сцену каждой из них, их же много инсансов - берушь исходный AABB у множаешь на матрицу инстанса - получаешь OBB для каждого объекта в мире.
> Я ведь правильно понял OBB - это ограничивающее тело?
zombihello, в общем и целом - да ) https://habrahabr.ru/post/257339/
Тема в архиве.