Докуметация Cтарт Статьи Форум Лента Вход
Не официальное русскоязычное сообщество
Главная
    Документация jMonkeyEngine
        jMonkeyEngine Уроки и Документация
            Документация для продвинутых пользователей
                Свечение и Отблеск(Bloom and Glow)

Свечение и Отблеск(Bloom and Glow)

Опубликованно: 16.06.2017, 14:25
Последняя редакция, Andry: 16.06.2017 22:35

Bloom — популярный эффект шейдера в индустрии 3D-игр. Обычно он представляет из себя отображение светящегося ореола вокруг источников света или яркие области сцены. На практике яркие области извлекаются из рендеринга сцены, размываются и, тогда уже, добавляются к рендерингу.

Эти образы дают представление о том, что дает свечение(bloom). Левое изображение не имеет эффекта свечения(bloom), изображение справа имеет.

nobloomsky blomsky

Bloom применение

  1. Создайте FilterPostProcessor
  2. Создайте BloomFilter
  3. Добавьте фильтр в processor
  4. Добавьте processor в viewPort
 FilterPostProcessor fpp=new FilterPostProcessor(assetManager);
 BloomFilter bloom=new BloomFilter();
 fpp.addFilter(bloom);
 viewPort.addProcessor(fpp);

Вот параметры, которые вы можете настроить:

Параметры  Методы  По умолчанию  Описание
blur scale  setBlurScale(float)  1.5f  Масштаб эффекта свечения(bloom), но будьте осторожны, высокие значения создают дефекты
exposure Power  setExposurePower(float)  5.0f  Цвет светящегося канала цветов повышается до значения мощности
exposure cut-off  setExposureCutOff(float)  0.0f  Поредел цвета для свечения(bloom) во время извлечения
bloom intensity  setBloomIntensity(float)  2.0f  Полученное значение свечения(bloom) умножается на эту интенсивность

Вам, вероятно, придется настроить эти параметры в зависимости от вашей сцены.

Карта Bloom с glow

Иногда вы хотите иметь больше контроля над тем, что светится(glow) и не светится(glow). Фильтр свечения(bloom) поддерживает карту свечения(glow map) или цвет свечения(glow color).

Создание карты свечения(glow map)

Давайте возьмем пример Парящего танка(hover tank), из данных тестового комплекте JME3.
Здесь вы можете увидеть диффузную карту(diffuse map) танка и соответствующую карту свечения(glow map), которая содержит только части текстуры, которые будут светиться и их цвет свечения:

tank_diffuse_ss tank_glow_map_ss

Карты Glow работают с определениями Lighting.j3md, Particles.j3md и SolidColor.j3md. Материал танка выглядит следующим образом:

Material My Material : Common/MatDefs/Light/Lighting.j3md {
     MaterialParameters {
        SpecularMap : Models/HoverTank/tank_specular.png
        Shininess : 8
        NormalMap : Models/HoverTank/tank_normals.png
        DiffuseMap : Models/HoverTank/tank_diffuse.png
        GlowMap : Models/HoverTank/tank_glow_map_highres.png
        UseMaterialColors : true
        Ambient  : 0.0 0.0 0.0 1.0
        Diffuse  : 1.0 1.0 1.0 1.0
        Specular : 1.0 1.0 1.0 1.0
     }
}

Карта свечения(glow map) описывается здесь: GlowMap : Models/HoverTank/tank_glow_map_highres.png

Применение

  1. Создайте FilterPostProcessor
  2. Создайте BloomFilter с параметром GlowMode.Objects
  3. Добавьте фильтр в processor
  4. Добавьте processor в viewPort
  FilterPostProcessor fpp=new FilterPostProcessor(assetManager);
  BloomFilter bf=new BloomFilter(BloomFilter.GlowMode.Objects);
  fpp.addFilter(bf);
  viewPort.addProcessor(fpp);

Вот результат:

tanlglow1

Bloom с glow color

Иногда вам нужно что бы целый объект светился, а не только его части. В этом случае вам нужно будет использовать параметр glow color.

Применение

  1. Создайте материал для своего объекта и установите параметр GlowColor
  2. Создание фильтра FilterPostProcessor
  3. Создайте BloomFilter с помощью параметра GlowMode.Objects
  4. Добавить фильтр в processor
  5. Добавьте processor в viewPort
    Material mat = new Material(getAssetManager(), "Common/MatDefs/Misc/SolidColor.j3md");
    mat.setColor("Color", ColorRGBA.Green);
    mat.setColor("GlowColor", ColorRGBA.Green);
    fpp=new FilterPostProcessor(assetManager);
    bloom= new BloomFilter(BloomFilter.GlowMode.Objects);
    fpp.addFilter(bloom);
    viewPort.addProcessor(fpp);

Вот результат на плазменном шаре Oto (до и после):

otonobloom otoglow

Советы и рекомендации

Увеличение размытости и снижение стоимости fps

Рендеринг свечения пробуется на текстуре, которая имеет те же размеры, что и область просмотра(viewport). Вы можете уменьшить размер выборки свечение(bloom) только с помощью метода setDownSamplingFactor следующим образом:

 BloomFilter bloom=new BloomFilter();
 bloom.setDownSamplingFactor(2.0f);

В этом примере размер выборки делится на 4 (ширина/2, высота/2), что приводит к уменьшению количества работы, чтобы размыть сцену. Полученная текстура затем отбирается до размера экрана с использованием аппаратной билинейной фильтрации. Это приводит к более широкому размытию.

Использование классического свечение(bloom) в сочетании с картой свечения(glow map)

Скажем, вы хотите, чтобы на вашей сцене происходило глобальное свечение(bloom), но у вас так же есть светящийся объект. Вы можете использовать только один bloom фильтр для обоих эффектов

BloomFilter bloom=new BloomFilter(BloomFilter.GlowMode.SceneAndObjects);

Однако обратите внимание, что оба эффекта будут обладать одинаковыми значениями атрибута, а иногда это не то, что вам нужно.

Оформление поддержки вашего домашнего смешенного Glow описания материала(material definition)

Предположим, вы создали собственный материал самостоятельно и хотите, чтобы он поддерживал карты свечения(glow map) и цвет свечения(glow colo). В вашем описании материала вам нужно добавить эти строки в разделе MaterialParameters:

 MaterialParameters {

        ....

        // Текстура светящихся частей материала
        Texture2D GlowMap
        // Цвет свечения((glow colo)) объекта
        Color GlowColor
    }

Затем добавьте следующую technique:

    Technique Glow {

        LightMode SinglePass

        VertexShader GLSL100:   Common/MatDefs/Misc/SimpleTextured.vert
        FragmentShader GLSL100: Common/MatDefs/Light/Glow.frag

        WorldParameters {
            WorldViewProjectionMatrix
        }

        Defines {
            HAS_GLOWMAP : GlowMap
            HAS_GLOWCOLOR : GlowColor
        }
    }

Затем вы можете использовать этот материал с помощью BloomFilter

Сделать что бы светящийся объект перестал светиться

Если вы используете карту свечения(glow map), удалите текстуру из материала.

material.clearTextureParam("GlowMap");

Если вы используете цвет свечения(glow colo), установите его в черный цвет

material.setColor("GlowColor",ColorRGBA.Black);

Переведено для jmonkeyengine.ru, оригинал
Автор перевода: Andry

Добавить комментарий

jMonkeyEngine.ru © 2017. Все права сохранены.