Всем доброго вечера! Использую C++ и Direct3D 9. Предположим есть какой-то большой мир, но плоский. То есть разумеется мир то будет 3D, только объекты будут рассчитываться только по двум осям. Например размер карты 1024x1024 блока (кубика), а каждый блок характеризуется байтом. Вот пример части такой карты: Код (Text): 1 1 1 1 1 1 1 1 1 1 1 P 1 2 2 2 2 1 0 1 1 0 1 2 0 0 2 1 0 1 1 0 1 2 0 0 2 1 0 1 1 0 1 2 0 0 2 1 0 1 1 0 0 0 0 0 2 1 0 1 1 0 1 2 2 2 2 1 0 1 1 0 1 1 1 1 1 1 0 1 1 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 Где: Код (Text): 0 - пустота 1 - блок одной текстуры 2 - блок другой текстуры P - позиция старта игрока (всё равно какое направление взгляда игрока, пускай будет случайное) То есть получается что камера игрока привязано жёстко к одной из оси (к оси оY) и изменяет своё положение по двум другим осям. Под ногами всегда будет плоскость с одной и той же текстурой, а вверху будет синее небо (некий такой Doom под открытым небом). Мы можем загрузить все используемые текстуры в память видеокарты и уже потом получать на них указатель, но как выводить такую карту? Всё хранить в одном буфере или в нескольких? Как правильно сделать, с учётом того, что блоки могут быть разной текстуры. Думаю что вариант, когда создать буфер вершин и внести в него вершины куба и потом выводить куб за кубом из этого буфера (даже если и составить список вывода, отсортированный по текстурам), не подойдёт. Ведь зачем выводить все кубики, ведь не все они видны камере. Да, есть пирамида видимости камеры. Можно проверять лежит ли кубик в пирамиде видимости камеры и тогда выводить его. Но опять же, мало того, что не все полигоны у кубика видны для камеры, так ещё и другие кубики будут закрывать другие кубики (а время на их вывод будет тратиться). Для большой такой карты, можно было бы разбивать пространство на полупространства (делим карту на 4 части и далее каждую на 4 части до тех пор, пока не найдём такие, которые будут видны и не делимы на невидимые). А для тех, зон, которые мы видим, проверять объекты на пирамиду видимости камеры. Но как проверять какие грани мы видим у кубика и какие кубики закрыты другими кубиками? Вот это я не могу придумать. Как вообще составлять такой мир и выводить его?
Z3N Я тут по Интернету рыскаю в поисках разных статей по этим вопросам и везде говорится про Z-Buffer. То есть если его включить, то мне не нужно будет в программе самому определять видимые полигоны, аппаратура сама их удалит и мне нужно будет только определять какие объекты перекрыты, чтобы их не выводить?
Z3N Ну а как эффективнее всё это хранить. Запихать весь видимый уровень в один буфер вершин или как? Ведь выводить нужно как-то с учётом текстур.
Z3N А выводить? Отсортировать треугольники в буфере по текстурам и за количество выводов из этого буфера, равное количеству текстур, всё вывести?
С сортировкой тоже не все так просто получается. Из-за нее не получится жесткие вещи выводить дисплей-листами. А ими очень рекомендуется пользоваться. Хотя можно, конечно, для каждой текстуры создать дисплей-лист покрываемых ей полигонов. И вызывать просто последовательность этих листов на рисование, между ними сменяя текстуры.