Как создать куб из более мелких кубиков (вокселей)?

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

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

Один из способов - использовать инстансный рендеринг. В Direct3D я мог использовать два буфера: Первый буфер будет содержать данные для одного экземпляра куба (например, положения вершин, координаты текстуры, нормали и т. д.). Второй буфер будет содержать позицию для каждого воксела во втором буфере.

Да, это одна из возможностей. В зависимости от количества вокселей может быть лучше сначала выделить видимую поверхность.

Nico Schertler 29.10.2018 08:23

другая возможность - использовать 3D-текстуру для хранения ваших данных вокселей ... см. Как лучше всего написать воксельный движок на C с учетом производительности

Spektre 29.10.2018 08:29
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
152
2

Ответы 2

Есть много разных способов рендеринга вокселей со своими достоинствами и недостатками. Судя по вопросу, похоже, что вы собираетесь что-то вроде сценария Minecraft.

Достаточно простой в реализации метод с разумной производительностью - это просто разбить мир на «куски» некоторого фиксированного размера. Каждый из этих фрагментов имеет связанный буфер вершин, и когда блок удаляется или изменяется каким-либо образом, буфер вершин для этого фрагмента обновляется. При рендеринге для каждого чанка выдается вызов отрисовки.

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

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

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

Привет, Хан. Нет, я не собираюсь использовать сценарий Minecraft. Напротив, я просто пытаюсь визуализировать большой куб как набор кубиков меньшего размера.

minime 31.10.2018 22:35

Во-первых, я предполагаю, что ваши большие кубы динамичны: они могут двигаться / вращаться, а также их воксели могут быть скрыты / видимы динамически. Если все статично, есть способы сделать это лучше, чем этот ответ.

Создание экземпляров, как вы описываете, является хорошим решением с точки зрения производительности, поскольку будет только один вызов отрисовки для визуализации всех вокселей (по сравнению с визуализацией каждого вокселя по одному)

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

Другие вопросы по теме