Рендерферма кроликов
> если на воксель тратим 1bit
А можно это на 2д перенести,чтобы тратить на 1 тайл 1 бит?
stratego
Нет. Смысл SVO в том, чтобы хранить лишь ПОВЕРХНОСТНЫЕ воксели, экономя память, ну а "внутренние" подменить нелистовыми нодами октодерева.
А в 2d тебе нужно видеть ВСЕ тайлы, глядя сверху
Если в Minecraft при fov 90 градусов, размер куба на дальности 128 - это 1/256 ширины экрана, при разрешении 1024 это 4 пиксела. Обьединять кубы тоже некрасиво, и невозможно для разнородных материалов
Аналогичный вопрос с вокселями - как их рисовать на экране, - кубиками, точками или point sprite?
И также LOD не всегда построишь
ЗЫ. Я ваш воксель разрушал
Рендерферма кроликов
Темпоральной когерентностью пользуйся, для далеких объектов работает идеально
Вий
Для чего работает, culling или что? Если просто стоя на месте вертишь головой - уже дальние обьекты меняются
Строить воксели из полигональной модели - тоже не просто. Если реализовать напрямую - до построения SVO надо рендерить модель в трехмерный массив, а это куча памяти
Рендерферма кроликов
Стоя на месте ты видишь одни и те же точки мира. Проецируй их на куб и крути камеру внутри куба.
Вий
Ну а если начал двигаться - придется добавить параллакс и гдето сделать переход между кокселями и скайбоксом, и он будет заметен
Кстати вот, если переделать CubeRT на скайбокс, то будут квады, параллельные осям viewspace и упростится проецирование и текстурирование ценой последующего рисования текстурированного скайбокса
Рендерферма кроликов
Текстурированный скайбокс хорошо рисовать аппаратно.
Переход не нужен, просто когда воксель уехал из пикселя и на его место не заехал соседний, пусти в этот пиксель луч
Вий
> Текстурированный скайбокс хорошо рисовать аппаратно
Текстура формируется на cpu, каждый кадр ее пересылать
Ну или пускай лучи рандомом как в кроликах я делал - 1/16 экрана псевдорандомно, если оттрасировало т что-то более близкое чем дала репроекция, повтори с соседями, так быстро отрисуешь внезапно выскочивший близкий воксель закрывающий часть репроекции
Рендерферма кроликов
Ты чтобы на экране картинку получить все равно каждый кадр пересылаешь фреймбуфер. К тому же для невидимых задних граней можно не пересылать. А видимые можно поделить на части и пересылать только для видимых частей текстуру
Вий
Да, в Minecraft можно трассировать пиксели через минимальный размер куба на экране, даже при дистанции 128 получается 256 х 192 (для экрана 4:3) - можно быстро оттрассировать, получив индексы видимых кубов и передав в glDrawElements. А там рисовать один куб инстансингом, смещая координаты. Вернее, одну грань
Алгоритм можно ускорить, во 1х не трассировать целиком области экрана, покрытые ближними кубами, во 2х, для дальних кубов, эффективно миновать лучом большие пустые пространства, используя 3d mipmap
Вий
Нужно написать трассировку по 3d массиву с mipmap, но чтото туплю
Сейчас для каждого луча высчитываю время между последовательными пересечениями коорд плоскостей (X=const итд) с шагом 1 и в цикле выбираю ближайшее, увеличиваю его время на соотв const шаг
А как переформулировать для вложенных кубов размера степень 2?
Рендерферма кроликов
О, Мимокрафт с трассировкой? Пытался я такое замутить позапрошлым летом или около того! Ниасилил, конечно, но проработал изрядное количество бумажных черновиков, как бы мол нам так это всё сделать, чтобы скорость была «60 fps на дистанции 256 чанков на Ленове x201i», в мечтах, кек.
В общем, взял нечто типа Wolf3D с его сугубо горизонтальным рейкастом, а дальше оно должно анализироваться столбцами, причём, очевидно, в дальних чанках уже должен идти какой-никакой LOD с укрупнением столбцов (вплоть до столба размером во весь чанк). Смотрим строго вперёд, прицеливание — смещением крестика прицела, низ и верх экрана — строго 45°, если добрались до грани — меняем оси координат и переключаем вид на «под ноги» (или, соответственно, «поза воющего на луну волка»). Такое нарочитое ретро, под Вольф (ну и с этого ретро имеем скорость и простоту реализации, а не ретро ради ретро).
Каст каждый шаг ограничивается найденными сверху и снизу кубиками, if any. Если кубик нашёлся в середине — бида-бида, дальше каст придётся вызывать рекурсивно, для столбцов выше кубика и столбцов ниже кубика. Надеюсь, понятно объяснил (ну алгоритм вообще детский, поэтому должно быть понятно, кек).
А вот как я это пытался запихнуть в GLSL (кстати, буквально на этой Ленове, и это уже лол, а не кек) — это тема для небольшой пятничной статьи на Хабре, если кому интересно.
Написать? Я попробую, если хотите, только надо до утра сначала дожить, чтобы мне флюс вскрыли. Я из-за этого и пишу сейчас не очень внятно, ибо флюс — это не только внезапно, но и больно, температурно и мозгонесовместимо.
Рендерферма кроликов
> Вот, исправил баги CubeRT.
А что такие странные ребра у кубов на скриншоте? И что там у тебя за сцена с кубами? Можно сдампить, чтобы можно было письками помериться?
Тема в архиве.