Raycasting Voxels и OpenGL - PullRequest
       30

Raycasting Voxels и OpenGL

2 голосов
/ 26 июня 2011

В настоящее время я изучаю raycasting и вокселы, которые являются хорошей комбинацией.Voxelrenderer Себастьяна Шольца реализует это довольно хорошо, но также использует OpenGL.Мне интересно, как работает его формула;как вы можете использовать OpenGL с raycasting и вокселями?Разве идея для лучевой передачи не заключается в том, чтобы луч отбрасывался на каждый пиксель (или линию, т.е. в Doom), а затем выводил результат?

Ответы [ 2 ]

5 голосов
/ 26 июня 2011

Упомянутый raycaster - это Voxelrenderer, то есть метод визуализации объемных данных, таких как помутнения, хранящиеся в трехмерной текстуре.Алгоритм радиопередачи Doom имеет другое предназначение: для каждого пикселя на экране найдите первую плоскую поверхность карты и нарисуйте там цвет.Растеризация возможностей современных графических процессоров устранила это использование радиокастеров.

Визуализация объемных данных в реальном времени по-прежнему является задачей, выполняемой специальным оборудованием, обычно используемым в медицинских и геодезических системах визуализации.В основном это огромные объемы оперативной памяти (несколько десятков ГБ), в которых хранятся объемные данные RGBA.Затем для каждого пикселя на экране луч проходит через объем, а данные RGBA интегрируются в этот луч.GPU Voxelrenderer делает то же самое с помощью фрагментного шейдера;псевдокод:

vec4f prev_color;
for(i=0; i<STEPS; i++) {
    p = ray_direction * i*STEP_DELTA;
    voxel = texture3D(volumedata, p);
    prev_color = combine(voxel, prev_color);
}
final_color = finalize(prev_color);

finalize и combine зависит от типа данных и того, что вы хотите визуализировать.Например, если вы хотите интегрировать плотность (как в рентгеновском изображении), combine будет операцией суммирования и завершит нормализацию.Если бы вы визуализировали облако, вы бы смешали альфа-канал между вокселями.

0 голосов
/ 25 февраля 2017

Радиопередача в пространстве вокселей не будет использовать пиксели, это будет неэффективно.

У вас уже есть массив, чтобы сказать, какие пробелы пусты, а какие имеют воксельный куб.

Таким образом, быстрая версия отслеживает линию, которая проверяет emptimess каждого вокселя в направлении линии, пока он не достигнет полного вокселя.

Это заняло бы несколько сотен операций чтения из памяти и 2-3 умножения вектора луча на каждую операцию чтения.

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

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

...