В продолжении темы (http://www.gamedev.ru/code/forum/?id=218315), двигаюсь дальше.
Эскизы дизайнера таковы:
- передний план глобуса в крапинку (это сделано, с костылями, но результат такой как я хочу)
- задний план размыт - как DOF, но основная идея отделить его от переднего плана
Самое простое решение - делать это текстурой. Этого достаточно. Вот что я сейчас имею:

Текстура:

Как я сделал текстуру (что б и швы были размазанны корректно).
1. Генератор с использованием векторной карты попиксельно - влоб перебором (с ускорением поиска по карте через кеш последней проверки), ~40 минут на i7 и 1024х512
2. Размножил полученную картинку 3 раза по горизонтали
3. Применил блур в Гимп по маске (с усилением к полюсам)
4. Вырезал центр - таким образом швов нет
При наложении на сферу (равнопромежуточная проекция, где lat/lon проецируется просто в картинку) получаю артефакты на полюсах.
Чем и как это можно убрать?
Что приходит на ум:
1. разбиение сферы через тесселяцию исокаэдр с правильной установкой S/T координат для полюса (вычислить для них lon как серединка между теми двумя вершинами что лежат на соседней долготе не на полюсе)
2. костыли в виде геометрии и рендерить весь задник тупо поликами одного цвета (довольно сложная задача нагенерить нужной геометрии из векторной карты - и триангуляция, и размытие)
3. загонять анизотропную фильтрацию, но это не очень хорошо так как целевое разрешение визуализации 4K, и в общем надо экономить что б был резерв
4. сделать псевдо-куб-мап текстуру (настоящая закрыта в АПИ, и ее нет, а АПИ многопоточен - сырой OpenGL это тут очень плохо), сделать геометрию как предлагали в первом топике и просто попроецировать все на глобус - артефакты должны быть почти не заметны по сравнению с тем что сейчас, но, проблема с пред-блуром текстуры - что б ничего не потерялось по краям
5. DOF - сложно, надо отделять один слой, блурить, потом смешивать с передними. затратно по времени реализации + потенциальные проблемы на краях глобуса
6. Добиться аккуратного изображения близко к полюсу, а сам полюс... сделать полигонами :)
Но опять таки как можно сделать так что б блур не схлопывался в "сингулярность черной дыры" к полюсу. Спасибо :)
chak
Дай исходную текстуру, которую нужно размыть. Я её тебе размою и верну.
MrShoor
Вот она: https://dl.dropboxusercontent.com/u/39961898/map.png
Или прямо отсюда:

Камень вода точит:)
Решил задачу - через смешивание двух текстур, обе 1024х512 (обрезанные по краям из 3-кратного тайла)
1. Отблурена ядром 30х30
2. Отблурена ядром 256x30
смешал их через smoothstep( 0.7, 1.0, abs( sin( latitude ) ) );
:)


chak
Построил distance field по сферическим координатам:
конечно это еще не размытие, надо подумать теперь как размыть это по гауссу
о, Интересно
Хоть я результата и достиг (как мне кажется), но все равно готов еще покопаться и попробовать другие подходы:)
chak
> о, Интересно
В градиентах оно интереснее выглядит:
А вообще можно влоб от O(n^2) пикселей построить такую текстуру. Причем 100% честную. Но интересно конечно было бы уменьшить сложность. :)
MrShoor
> конечно это еще не размытие, надо подумать теперь как размыть это по гауссу
DF с честным размытием не поможет.
Для малых размытий проще сгенерить матрицу коэффициентов и применить несколько раз.
Для больших, скорее всего, будет оптимально что-то типа: несколько ресемплеров подряд для уменьшения размера + остаточный блур + несколько ресемплеров чтобы вернуть размер на место.
Для совсем больших размытий — разложить на сферические гармоники, отмасштабировать, сгенерировать текстуру из гармоник.
}:+()___ [Smile]
> DF с честным размытием не поможет.
С честным нет. Честное можно в лоб посчитать через распределение по гауссу, но там O(n^2) по пикселям выходит, и O(1) достаточно тяжелый. Я написал без всяких оптимизаций, оно одну строку изображения пару минут считало. На 10+ часов ставить считать не было желания.
MrShoor
> Честное можно в лоб посчитать через распределение по гауссу
Я совсем не уверен, что честный сферический гаусс, в принципе, представим в элементарных функциях.
}:+()___ [Smile]
> Я совсем не уверен, что честный сферический гаусс, в принципе, представим в
> элементарных функциях.
Ну ок, честный с некоторой точностью. У меня примерная площадь пикселя считалась для гаусса.
MrShoor
> У меня примерная площадь пикселя считалась для гаусса.
Там не в конечности размеров пикселей дело, а в отклонении метрики поверхности от плоской.
Т. е. экспонента от квадрата расстояния — это формула для плоскости, а в случае сферы там будет другая функция.
Никто ещё не догадался текстурить CubeMap'ой размытой по гауссу с размером ядра пропорциональным коэффициенту Френеля?
Тема в архиве.