Многомасштабный рендеринг огромного 3D-объема с использованием WebGL

Я визуализирую огромный 3D-объем с помощью WebGL, а алгоритм приведения лучей реализован в шейдере (glsl). Объем создается из стеков биоизображений. Что я хочу сделать, так это плавно увеличивать и уменьшать масштаб при рендеринге этого трехмерного объема. Но стеки изображений имеют высокое разрешение, чтобы получить производительность в реальном времени, мне нужно использовать Octree. Есть ли у вас какие-либо предложения, как я могу это реализовать?


person hby001    schedule 22.09.2015    source источник
comment
Вам просто нужна реализация октодерева в javascript? Не должно быть сложно искать.   -  person WacławJasper    schedule 22.09.2015
comment
Кажется, у меня где-то есть. Он использовался для разделения цветового пространства, но его нетрудно адаптировать.   -  person Bartek Banachewicz    schedule 24.09.2015


Ответы (1)


Я не думаю, что вы получите Octree на графическом процессоре только с WebGL — он поддерживает только OpenGL ES 2.0, поэтому его может быть слишком мало для реализации приличного Octree.

Тем не менее, есть некоторые приемы, которые могут помочь в решении вашей проблемы. В общем, вы хотите ускорить рендеринг во время масштабирования/движения, но по возможности сохранить целевое качество. Вы можете реализовать качество «низкой четкости» и использовать его во время движения камеры. Проще всего было бы просто использовать больший шаг raycasting, вы также можете подготовить несколько версий ваших изображений с более низким разрешением.

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

Допустим, ваш обычный рендеринг занимает 1 секунду, а «низкое разрешение» — 0,1 секунды. При таком подходе вы можете получить интерактивное движение камеры со скоростью ~ 10 кадров в секунду, а когда вы перестанете двигаться, вы получите окончательное изображение сразу через 1 секунду.

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

Немного другой, но похожий подход заключается в рендеринге одного из каждых X пикселей во время интерактивного движения. В некоторых приложениях для 3D-моделирования, когда вы меняете вид/перемещаете какой-либо объект и включаете предварительный просмотр с трассировкой лучей, вы можете заметить, что он отображает только часть всех пикселей, сохраняя интерактивность. Когда вы останавливаете движение, он отображает остальные пиксели.

person kolenda    schedule 24.09.2015