Рендеринг усеченного прямоугольника - Дистанционный рендеринг - OpenGL - PullRequest
1 голос
/ 09 июня 2011

Я рендерил старый формат игры, в котором у меня есть список сеток, из которых вы состоите. Я наконец-то получил работу PVS (области, видимые из другой области), и это обрезает множество сеток, которые яне нужно рендерить, но не сильно.Итак, теперь мой список мешей, которые я должен рендерить, включает только другие меши, которые я могу видеть.Но это не идеально.Есть еще тонна мешей, в том числе очень далекие, которые прошли мимо клипа.

Теперь, во-первых, я пытаюсь отбросить сетки, которые не находятся в моем поле зрения.Я слышал, что ограничивающий прямоугольник - лучший способ сделать это.У кого-нибудь есть идеи о том, как я могу пойти по этому поводу?Я знаю, что мне нужна максимальная точка (x, yz) и минимальная точка (x, yz), чтобы поле охватывало все вершины.

Затем я проверяю и проверяю, является ли какая-либо из этих точекпо моему мнению усеченный?Это так просто?

Спасибо!

1 Ответ

2 голосов
/ 09 июня 2011

AABB или Axis Aligned Bounding Box - очень простой и быстрый объект для проверки пересечения / сдерживания двух трехмерных областей.

Как вы предполагаете, вы рассчитываете min и max x, y, z длядве области, которые вы хотите сравнить, например, область, которая описывает усеченную область, и область, которая описывает сетку.Он выровнен по оси, потому что последующий куб имеет ребра, параллельные каждой оси системы координат.Очевидно, что это может быть немного неточным (ложные положительные результаты пересечения / сдерживания, но никогда не ложные отрицательные), и поэтому, после того как вы отфильтруете свой список с помощью теста AABB, вы можете подумать о выполнении более точного теста для оставшихся сеток.

Вы проверяете на пересечение / удержание следующим образом:

F = AABB усеченного конуса

M = AABB меша

bool is_mesh_in_frustum(const AABB& F, const AABB& M)
{
    if( F.min.x > M.max.x || M.min.x > F.max.x || F.min.y > M.max.y || M.min.y > F.max.y || F.min.z > M.max.z || M.min.z > F.max.z )
    {
        return false;
    }
    return true;
}

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

Чтобы создать AABB, вы можете просто пройтись по вершинам сетки и записать минимум / максимумЗначения x, y и z, с которыми вы сталкиваетесь.

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

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

РЕДАКТИРОВАТЬ (для комментария):

AABB может давать ложные срабатывания, потому что это в лучшем случае точная форма области, которую вы ограничиваете, но, как правило, больше, чем область, которую вы ограничиваете.

Рассмотрим сферу, если вы используете AABB, это все равно что положить баскетбольный мяч в коробку, у вас есть все эти пробелы в углахполе, куда шарик не может добраться.

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

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

Вы можете исправить это, выполнив сначала тест AABB и создав меньший список сеток, которые возвращают значение true, а затем выполнив более точный тест в этом меньшем списке с болееТочный ограничивающий объем для усеченного конуса и / или ячеек.

...