Как эффективно выводить сцену с учётом видимости объектов?

Тема в разделе "WASM.DirectX", создана пользователем s3dworld, 28 сен 2011.

  1. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    Всем доброго вечера!

    Использую C++ и Direct3D 9. Предположим есть какой-то большой мир, но плоский. То есть разумеется мир то будет 3D, только объекты будут рассчитываться только по двум осям. Например размер карты 1024x1024 блока (кубика), а каждый блок характеризуется байтом. Вот пример части такой карты:

    Код (Text):
    1. 1 1 1 1 1 1 1 1 1 1
    2. 1 P 1 2 2 2 2 1 0 1
    3. 1 0 1 2 0 0 2 1 0 1
    4. 1 0 1 2 0 0 2 1 0 1
    5. 1 0 1 2 0 0 2 1 0 1
    6. 1 0 0 0 0 0 2 1 0 1
    7. 1 0 1 2 2 2 2 1 0 1
    8. 1 0 1 1 1 1 1 1 0 1
    9. 1 0 0 0 0 0 0 0 0 1
    10. 1 1 1 1 1 1 1 1 1 1
    Где:

    Код (Text):
    1. 0 - пустота
    2. 1 - блок одной текстуры
    3. 2 - блок другой текстуры
    4. P - позиция старта игрока (всё равно какое направление взгляда игрока, пускай будет случайное)
    То есть получается что камера игрока привязано жёстко к одной из оси (к оси оY) и изменяет своё положение по двум другим осям. Под ногами всегда будет плоскость с одной и той же текстурой, а вверху будет синее небо (некий такой Doom под открытым небом).

    Мы можем загрузить все используемые текстуры в память видеокарты и уже потом получать на них указатель, но как выводить такую карту? Всё хранить в одном буфере или в нескольких? Как правильно сделать, с учётом того, что блоки могут быть разной текстуры.

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

    Для большой такой карты, можно было бы разбивать пространство на полупространства (делим карту на 4 части и далее каждую на 4 части до тех пор, пока не найдём такие, которые будут видны и не делимы на невидимые). А для тех, зон, которые мы видим, проверять объекты на пирамиду видимости камеры. Но как проверять какие грани мы видим у кубика и какие кубики закрыты другими кубиками? Вот это я не могу придумать.

    Как вообще составлять такой мир и выводить его?
     
  2. Z3N

    Z3N New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    812
    Я что-то не особо понял, но похоже, что вам поможет BSP
    вики
    статья на кывт
     
  3. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    Z3N
    Я тут по Интернету рыскаю в поисках разных статей по этим вопросам и везде говорится про Z-Buffer. То есть если его включить, то мне не нужно будет в программе самому определять видимые полигоны, аппаратура сама их удалит и мне нужно будет только определять какие объекты перекрыты, чтобы их не выводить?
     
  4. Z3N

    Z3N New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    812
    Да, вроде как. Я не сильно разбираюсь в этом вопросе.
     
  5. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    Z3N
    Ну а как эффективнее всё это хранить. Запихать весь видимый уровень в один буфер вершин или как? Ведь выводить нужно как-то с учётом текстур.
     
  6. Z3N

    Z3N New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    812
    Ну, если используешь з буффер и карта небольшая, то будет логично запихнуть всё в один буфер.
     
  7. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    Z3N
    А выводить? Отсортировать треугольники в буфере по текстурам и за количество выводов из этого буфера, равное количеству текстур, всё вывести?
     
  8. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    540
    С сортировкой тоже не все так просто получается. Из-за нее не получится жесткие вещи выводить дисплей-листами. А ими очень рекомендуется пользоваться.

    Хотя можно, конечно, для каждой текстуры создать дисплей-лист покрываемых ей полигонов. И вызывать просто последовательность этих листов на рисование, между ними сменяя текстуры.