Каков наиболее эффективный способ рисования вокселей (кубов) в opengl?

Я хотел бы рисовать voxels, используя opengl, но похоже, что он не поддерживается. Я сделал функцию рисования куба, которая имела 24 вершины (4 вершины на лицо), но она снижает частоту кадров при рисовании 2500 кубов. Я надеялся, что есть лучший способ. В идеале я бы просто хотел отправить позицию, размер края и цвет на графическую карту. Я не уверен, могу ли я это сделать, используя GLSL для компиляции инструкций как часть шейдера фрагмента или шейдера вершин.

Я искал google и узнал о точечных спрайтах и ​​афишах (то же самое?). Могут ли они использоваться в качестве альтернативы быстрому созданию куба? Если я использую 6, по одному для каждого лица, похоже, что это будет посылать гораздо меньше информации на графическую карту и, надеюсь, получить мне лучшую частоту кадров.

Другая мысль, может быть, я могу нарисовать несколько кубов, используя один вызов drawelements?

Может быть, есть лучший метод, о котором я не знаю? Любая помощь приветствуется.

Ответы

Ответ 1

Рисование вокселей с кубами - это почти всегда неправильный путь (исключительный случай - трассировка лучей). То, что вы обычно хотите сделать, это поместить данные в трехмерную текстуру и отобразить фрагменты в зависимости от положения камеры. Смотрите эту страницу: https://developer.nvidia.com/gpugems/GPUGems/gpugems_ch39.html, и вы можете найти другие методы, выполнив поиск "тома рендеринга gpu".

Ответ 2

То, что вы ищете, называется instancing. Вы можете взглянуть на glDrawElementsInstanced и glDrawArraysInstanced для нескольких возможностей. Обратите внимание, что они были добавлены только в качестве основных операций относительно недавно (OGL 3.1), но были доступны как расширения еще довольно долго.

nVidia OpenGL SDK имеет пример инстанционного чертежа в OpenGL.

Ответ 3

Сначала вы действительно должны смотреть на OpenGL 3+, используя GLSL. Это был стандарт в течение довольно долгого времени. Во-вторых, большинство реализаций Minecraft-esque используют создание сетки на стороне процессора. Этот метод включает в себя просмотр всех позиций блоков и создание объекта буфера вершин, который отображает треугольники всех открытых лиц. VBO генерируется только тогда, когда вокселы меняются и сохраняются между кадрами. Идеальная реализация объединила бы компланарные грани одной и той же текстуры в более крупные грани.