2016-02-11 5 views
0

Я использую модель XML3D и сферу для отображения 360 фотографий. Проблема в том, что мне нужно часто менять большие текстуры.XML3D: Эффективное отображение и изменение больших текстур

  • Каков оптимальный способ использования XML3D или webgl для визуализации 360 фотографий?
  • Как оптимизировать переключение текстур? Было бы лучше иметь набор меньших текстур? Есть ли набор «хороших практик» для рендеринга 360 изображений?
  • Каков оптимальный способ достижения эффекта размытия между двумя 360
    Текстуры «неба»?
+0

Существует несколько способов отображения панорамных фотографий, это зависит от проекции - карты кубов и прямолинейные выступы являются общими. Что касается переключения текстур - просто используйте одну текстуру, если вам не требуется более высокое разрешение, чем ваше устройство. Размытие - вы имеете в виду перекрестное увядание? Это просто простой вызов 'mix()' в шейдере. –

+0

Я не спрашивал, как отображать 360 фотографий, но как выбрать оптимальный способ, если вам нужно рассказать о многих из них. – Pietrko

ответ

1

Если вы переключение между только два или три текстуры было бы быстрее альтернативы, но с таким количеством текстур ваш единственный практический вариант, чтобы загрузить их один за другим, изменив тег изображения:

<texture name="diffuseTexture"> 
    <img id="photo" src="images/photo1.jpg"/> 
</texture> 

document.querySelector("#photo").src = "images/photo2.jpg"; 

Если вы просматриваете это с помощью больших текстур (4096x2048), вы увидите огромное количество времени, затрачиваемого на вызов gl.texImage2D, где данные изображения декодируются, преобразуются и отправляются на GPU. Даже на рабочем столе это может привести к заиканию, ситуация становится намного хуже на мобильных устройствах.

Уменьшение размера ваших текстур ускорит процесс. Например, падение их с 4096x2048 до 2048x1024 приносит время, проведенное в gl.texImage2D, с ~ 53% до ~ 13% на моем рабочем столе.

Более низкоуровневая библиотека WebGL может дать вам еще несколько опций (например, преобразование изображений в Uint8Arrays вручную, прежде чем передать их texImage2D), но XML3D на самом деле не был разработан с учетом этого. И пока вы работаете с большими текстурами, у вас будут замедление, независимо от того, что вы делаете, особенно на мобильных устройствах.

Если вы можете поместить свои фотографии в видео, это будет работать намного лучше, так как в этом случае на GPU будет выполнено декодирование и преобразование. Конечно, у него есть свои недостатки.

выцветание одну текстуры в другую можно сделать очень просто в шейдере используя единую переменный:

uniform float uFade; 
... 
vec4 color1 = texture2D(texture1, texcoords); 
vec4 color2 = texture2D(texture2, texcoords); 
gl_FragColor = mix(color1, color2, uFade); 

Размытие включает в себя несколько этапов. Сначала вам нужно сделать вышеупомянутый микс в заставку FrameBuffer. Это становится входной текстурой для горизонтального размытия шейдера, выход которого задается вертикальным размытым шейдером, и, наконец, выход этого используется как текстура для объекта неба во время прохождения рендеринга сцены. Первые три шага должны быть представлены на полноэкранном квадранте.

Этот может быть сделано в XML3D используя RenderInterface и собственные RenderPasses, но ИМО это много хлопот, чтобы пройти для эффекта, который не очень отличается от простого замирания.

+0

Может быть, техника для мегатекста/виртуальной текстуры - это путь сюда, вы слышали о них? – Pietrko

+0

Слышал об этом, но я действительно не изучил его. С первого взгляда, кажется, много сложной для некоторых очень конкретных случаев использования, но я более подробно рассмотрю ее. Благодаря! – csvurt

+0

Ключевая часть здесь заключается в том, что я заранее знаю, сколько текстур мне нужно подготовить в любой момент. Для каждого места требуется одна панорама и не более 4 (5) выходов из каждой «сцены» на другие панорамы. Существует также и тот факт, что только около 30% текстуры кажутся очевидными, так как вы ограничены fov. – Pietrko

 Смежные вопросы

  • Нет связанных вопросов^_^