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

Оптимизация: Текстурный атлас

Опубликованно: 13.04.2017, 22:04
Последняя редакция, Andry: 26.09.2017 13:36

jme3tools.optimize.TextureAtlas позволяет комбинировать несколько текстур в один текстурный атлас. Загрузка одной геометрии с одним материалом намного эффективнее, чем обработка нескольких геометрий и материалов. Оптимально когда вы уже экспортируете свои текстуры в виде текстурного атласа, например из Blender.
jme3tools.optimize.GeometryBatchFactory, напротив, работает только если геометрия имеет только один материал с текстурами.

  1. Создадим объект TextureAtlas.
  2. Добавить текстуры в атлас текстур, каждая текстура идет на одной карте (например, DiffuseMap). +Данные изображения хранятся в байтовом массиве для каждой именованной карты текстур.
  3. Далее, вы получите каждую карту с названием используемой текстуры и используемого материала.

Пример Кода

API

 Методы TextureAtlas Применение
 addGeometry(g) Добавить к этой геометрии DiffuseMap (или ColorMap), NormalMap(карта нормалей), и SpecularMap(зеркальная карту) в атлас(если они существуют). DiffuseMap автоматически станет главной картой.
 addTexture(t, mapname) Добавьте текстуру к назначенной главной карте.
 addTexture(t1,mapName,t2) Добавьте текстуру t1 к названной вторичной карте и сделайте так, чтобы текстура t1 соответствовала текстуре t2 на главной карте. t2 может быть объектом Texture или строковым именем текстуры.
 applyCoords(g) Применяет координаты текстуры к сетки геометрии. Кратко по умолчанию applyCoords(geom, 0, geom.getMesh().
 applyCoords(g,offset,mesh) Применяет координаты текстуры с заданным смещение буфера текстуры к сетке, если в атласе существуют DiffuseMap или ColorMap в вводимой геометрии g. Сетка может быть g.getMesh(). Цель смещения буфера находится между 0 и buffer.size().
 getAtlasTile(texture) Получите TextureAtlasTile для данной текстуры. Объекты TextureAtlasTile содержат информацию об этой текстуре. Такие как размер и расположение в атласе.
 getAtlasTexture(mapName) Создает новый текстурный атлас с добавленной текстурой указанной с помощью переменой имени карты.
 Методы TextureAtlasTile Применение
 getHeight(), getWidth() Получить размер текстуры.
 getX(), getY() Получаиьт координаты X и Y внутри текстурного атласа, где эту текстуру можно найти
 addTexture(t1,mapName,t2) Применение
 transformTextureCoords(inBuf,offset,outBuf) Применение
 getLocation(l) Получить преобразованную координату текстуры для задания местоположения ввода.

Первичные и вторичные карты

Вспомогательные методы, которые работают с объектами Geometry, автоматически учитывают DiffuseMap (для материалов на основе Lighting.j3md) или ColorMap (для материалов на основе Unshaded.j3md), главная карт, также обрабатывает NormalMap и SpecularMap как вторичные карты, если они существуют В Геометрии.

  • Первое название карты, которое вы назначаете, становится главной картой. Главная карта определяет местоположения в атласе. Как правило, вы называете основную карту DiffuseMap (для Lighting.j3md) или ColorMap (для Unshaded.j3md). В общем случае, если вы хотите использовать текстуру с определенным шейдером, для ясности вам нужно указать названия карт, указанные в этом .j3md этого шейдера.
  • Вторичные текстуры (другие названия карт, например SpecularMap и NormalMap для Lighting.j3md) должны ссылаться на существующую текстуру на главной карте, поэтому Атлас знает, где разместить добавленную текстуру на вторичной карте. Это необходимо, потому что карты совместно используют текстурные координаты, и следовательно их нужно размещать в одном и том же месте на обеих картах. Если вы не разделяете координаты текстуры на своих картах, используйте отдельные классы TextureAtlas.

Вы ссылаетесь на текстуры по их ключевому имени, это их «идентификатор(id)». Для каждой текстуры атлас сохраняет свое местоположение. Текстура с существующим ключевым именем никогда не добавляется в атлас более одного раза. Вы можете получить доступ к информации для каждой текстуры или геометрии с помощью вспомогательных методов.

  • Текстуры не масштабируются автоматически, и ваш атлас должен быть создан достаточно большим, чтобы удерживать все текстуры. Все методы, которые позволяют добавлять текстуры, возвращают false, если текстура не может быть добавлена из-за переполнения атласа.
  • Вторичные текстуры (normal maps, specular maps и.т.д.) Должны быть того же размера, что и основная (например, DiffuseMap) текстура.
  • TextureAtlas позволяет вам изменять координаты текстуры, сетки или геометрии, для задания нового места ее текстуры внутри атласа (если текстура существует внутри атласа). ??
Обратите внимание, что модели, использующие координаты текстуры вне диапазона 0-1 (то есть они используют повторяющиеся/обертывающие(repeating/wrapping) текстуры), не работают корректно, поскольку их новые координаты просачиваются в другие части атласа и таким образом отображают другие текстуры вместо повторения текстуры!

Примеры использования: Объединение геометрий

Используйте makeAtlasBatch, чтобы превратить несколько геометрий, загружаемых из j3o файла, в одну геометрию:

 // Сцена содержит множество геометрий, привязанных к одному узлу:
 Node scene = assetManager.loadModel("Scenes/MyScene.j3o");
 // geom - это одна геометрия, содержащая все эти геометрии вместе
 Geometry geom = TextureAtlas.makeAtlasBatch(scene);
 rootNode.attachChild(geom);

Создание текстурного атласа и изменение текстурных координат одной геометрии:

 Node scene = assetManager.loadModel("Scenes/MyScene.j3o");

 // Автоматически создадим текстуру Atlas из существующего узла, имеющего геометрию ...
 TextureAtlas atlas = TextureAtlas.createAtlas(scene);

 //... или создадим Атлас вручную, добавив текстуры (например, myDiffuseTexture) в атлас,
 TextureAtlas atlas = new TextureAtlas(1024,1024);
 atlas.addTexture(myDiffuseTexture, "DiffuseMap");

 // ... или создадим Atlas вручную, добавив в атлас текстурированные геометрии (например, myGeometry):
 TextureAtlas atlas = new TextureAtlas(1024,1024);
 atlas.addGeometry(MyGeometry);

 // Создайте материал, загрузите текстуру из Атласа, примените текстуру к карте материала.
 Material mat = new Material(mgr, "Common/MatDefs/Light/Lighting.j3md");
 mat.setTexture("DiffuseMap", atlas.getAtlasTexture("DiffuseMap"));

 // Получите одну sub-geometry на которой вы хотите использовать Атлас, примените координаты
 // текстуры этой геометрии к атласу, и замените материал.
 Geometry geom = scene.getChild("MyGeometry");
 atlas.applyCoords(geom);
 geom.setMaterial(mat);

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

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

Содержание

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