Каков наиболее эффективный способ рисования вокселей (кубов) в 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 генерируется только тогда, когда вокселы меняются и сохраняются между кадрами. Идеальная реализация объединила бы компланарные грани одной и той же текстуры в более крупные грани.