Я новичок в графике, поэтому прошу высказать свое мнение / предложения.
Я хочу создать (и визуализировать) большой куб, состоящий из кубиков меньшего размера (вокселей). Хитрость в том, что я хочу иметь возможность удалять вокселы по своему желанию.
Один из способов - использовать инстансный рендеринг. В Direct3D я мог использовать два буфера: Первый буфер будет содержать данные для одного экземпляра куба (например, положения вершин, координаты текстуры, нормали и т. д.). Второй буфер будет содержать позицию для каждого воксела во втором буфере.
другая возможность - использовать 3D-текстуру для хранения ваших данных вокселей ... см. Как лучше всего написать воксельный движок на C с учетом производительности
Есть много разных способов рендеринга вокселей со своими достоинствами и недостатками. Судя по вопросу, похоже, что вы собираетесь что-то вроде сценария Minecraft.
Достаточно простой в реализации метод с разумной производительностью - это просто разбить мир на «куски» некоторого фиксированного размера. Каждый из этих фрагментов имеет связанный буфер вершин, и когда блок удаляется или изменяется каким-либо образом, буфер вершин для этого фрагмента обновляется. При рендеринге для каждого чанка выдается вызов отрисовки.
Выбор правильных размеров для блока очень важен для производительности. Если ваши фрагменты слишком велики, восстановление буфера вершин при изменении блока будет дорогостоящим. Если фрагменты слишком малы, общее количество фрагментов будет большим, что приведет к накладным расходам драйвера при их рендеринге.
Для повышения производительности могут применяться дополнительные алгоритмы скрытия, чтобы избежать добавления скрытых треугольников в буферы вершин.
Вы можете сделать гораздо больше, чтобы улучшить производительность и расширить пределы возможностей рендеринга вокселей, но это хорошее место для начала.
Привет, Хан. Нет, я не собираюсь использовать сценарий Minecraft. Напротив, я просто пытаюсь визуализировать большой куб как набор кубиков меньшего размера.
Во-первых, я предполагаю, что ваши большие кубы динамичны: они могут двигаться / вращаться, а также их воксели могут быть скрыты / видимы динамически. Если все статично, есть способы сделать это лучше, чем этот ответ.
Создание экземпляров, как вы описываете, является хорошим решением с точки зрения производительности, поскольку будет только один вызов отрисовки для визуализации всех вокселей (по сравнению с визуализацией каждого вокселя по одному)
Теперь, чтобы иметь возможность скрыть любой воксель, вот трюк, который вы можете использовать: в вашем буфере данных экземпляра вы можете добавить значение шкалы вместе с позицией, а затем просто установите масштаб на ноль, если вы хотите скрыть воксель.
Да, это одна из возможностей. В зависимости от количества вокселей может быть лучше сначала выделить видимую поверхность.