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

JMonkeyEngine3 Спецификация материалов

Опубликованно: 21.05.2017, 21:23
Последняя редакция, Andry: 30.09.2017 21:20

Общий синтаксис

Описания материалов(Material definition) и файлы экземпляров материалов(Material instance) отформатированы аналогичным языком в фигурных скобках, другими словами, у вас есть блоки и вложенные в них другие блоки, окруженные фигурными скобками. Внутри блоков есть операторы, следующий оператор начинается после новой строки или точки с запятой, чтобы разрешить два оператора в одной строке. Комментарии производятся с префиксом //, комментарии в стиле /* */ не допускаются.

Пример:

RootBlock {
  // Комментарий
  SubBlock NameForTheBlock {
    Statement1 // Другой комментарий
  }
  SubBlock2 {
    SubSubBlock {
      Statement2
      Statement3
      // Два оператора на одной строке
      Statement4; Statement5
    }
  }
  SubBlock3
    { // Скобка может быть и на следующей строке
    }
}

Синтаксис для файлов J3MD и J3M следует из этого базового формата.

Файлы Описания материала (J3MD)(Material definition)

Описания материалов обеспечивают «логику материала». Обычно это шейдер, который будет обрабатывать рисование объекта и соответствующие параметры, которые позволяют настроить шейдер. Файл J3MD абстрагирует шейдер и его конфигурацию от пользователя, предоставляя простой интерфейс, в котором можно просто задать несколько параметров на материале, чтобы изменить его внешний вид и способ его обработки.

Описания материалов поддерживают несколько методов, каждый из которых описывает другой способ рисования объекта. Например, в настоящее время в jME3, например, для визуализации карт теней используется дополнительный метод.

Шейдеры

Поддержка шейдеров внутри файлов J3MD достаточно сложна. Во-первых, шейдеры могут ссылаться на библиотеки шейдеров, подобно тому, как «оператор импорта Java или C ++» включают директиву pre-processor. Шейдерные библиотеки, в свою очередь, также могут ссылаться на другие библиотеки шейдеров. В конце концов, шейдер может использовать множество функций из многих библиотек и комбинировать их таким образом, чтобы создать более продвинутый эффект. Например, любой шейдер, который хочет воспользоваться аппаратным скинированием, может просто импортировать библиотеку шейдеров скиннинга и использовать эту функцию без необходимости писать специфическую логику, необходимую для аппаратного скининга.

Шейдеры могут также использовать преимущества «описаний, которые указаны внутри описания материалов. Описание определяет привязки к параметрам материала, так что изменение параметра материала можно применить или удалить описание из соответствующего шейдера. Это позволяет шейдеру полностью изменять поведение во время выполнения.

Хотя можно использовать шейдерные юниформы для той же цели, они могут замедлять работу старых графических процессоров, которые не поддерживают ветвление. В этом случае использование описаний может позволить изменить способ работы шейдера без использования шейдерных юниформ. Однако, чтобы ввести описания в шейдер, его исходный код должен быть изменен, и, следовательно, он должен быть перекомпилирован. Поэтому не рекомендуется часто изменять описанные параметры привязки.

Синтаксис файла J3MD

Все файлы J3MD начинаются с MaterialDef в качестве корневого блока, после чего следует название описания материала (в этом примере Test Material 123). В настоящее время это имя не используется ни для чего важного, кроме отладки. Имя вводится без кавычек и может содержать пробелы.

Пример первой строки файла J3MD:

MaterialDef Test Material 123 {

Внутри блока MaterialDef может быть не более одного блока MaterialParameters и одного или нескольких блоков Technique.

У Technique может быть необязательное имя, которое указывает название Technique. Если для Technique не указано имя, тогда его имя «Default», и оно используется по умолчанию, если пользователь не указывает другую Technique, используемую для материала.

Пример J3MD:

MaterialDef Test Material 123 {
  MaterialParameters { }
  Technique { }
  Technique NamedTech { }
}

Внутри блока MaterialParameters задаются параметры. Каждый параметр имеет тип и имя. Параметры материала аналогичны переменным Java в этом аспекте.

Пример блока MaterialParameters:

MaterialParameters {
    Texture2D TexParam
    Color     ColorParam
    Vector3   VectorParam
    Boolean   BoolParam
// ...
}

В то время как в файле J3MD, имена и типы параметров, указанные в J3M (экземпляр Material), значения этих параметров задаются, как будет показано позже. Именно так настраиваются материалы.

На момент написания статьи в файлах J3MD допускаются следующие типы параметров: Int, Boolean, Float, Vector2, Vector3, Vector4, Texture2D, TextureCubeMap.

Вы можете указать значение по умолчанию для параметров материала, внутри описаний материала, в случае, если в экземпляре материала не указано значение.

MaterialParameters {
     Float MyParam : 1
// ...
}

1 будет использоваться в качестве значения по умолчанию и отправляться в шейдер, если он не был задан вызовом meterial.setFloat().

Techniques

Techniques — более продвинутые блоки, чем блок MaterialParameters. Techniques могут иметь вложенные блоки, любые типы операторов.

В этом разделе будут описаны инструкции и вложенные блоки, которые разрешены внутри блока Technique.

Двумя наиболее важными операторами являются операторы FragmentShader и VertexShader. Эти инструкции определяют шейдер, который будет использоваться для этой Techniques, и требуются внутри «Techniques по умолчанию». Оба работают одинаково, после инструкции указывается язык шейдера, как правило, с номером версии, например GLSL100 для OpenGL Shading Language версии 1.00. Затем следует двоеточие и полный путь для asset, описывающего исходный код шейдера. Для GLSL разрешено указывать файлы .glsl, .frag и .vert.

Когда материал применяется к объекту, шейдер имеет свою юниформу, основанную на значениях параметров материала, указанных в экземпляре материала. Но параметр имеет префикс «m_.

Например, предположим, что параметр Shininess определен в блоке MaterialParameters следующим образом:

MaterialParameters {
  Float Shininess
}

Значение этого параметра будет отображаться в юниформе с тем же именем с префиксом m_ в GLSL-шейдере:

uniform float m_Shininess;

Буква m в приставке обозначает материал.

World/Global параметры

Важной структурой, которая также относится к шейдерам, является структура WorldParameters. По своей структуре он аналогичен структуре MaterialParameters; Она предоставляет различные параметры для шейдера, но работает по-другому. В то время как пользователь задавал параметры материала, World параметры указываются движком. Кроме того, структура WorldParameters вложена в Technique, потому что она специфична для используемого шейдера. Например, параметр Time в world указывает время в секундах с момента запуска движка, материал может выставить этот параметр для шейдера, указав его в структуре WorldParameters следующим образом:

WorldParameters {
  Time
// ...
}

Шейдер будет иметь доступ к этому параметру через юниформу, также называемую Time, но с префиксом g_:

uniform float g_Time;

Буква g обозначает «global», который считается синонимом «world» в контексте области параметров».

Для шейдеров доступно множество world параметров, полный список будет указан в другом месте.

RenderState

Блок RenderState задает значения для различных состояний рендеринга в контексте рендеринга. Блок RenderState находится внутри блока Technique. Существует много типов состояний рендеринга, и полный список не будет включен в этот документ.

Наиболее часто используемым состоянием визуализации является альфа-смешивание, чтобы указать его для определенной Technique, включая блок RenderState с инструкцией Blend Alpha.

Пример:

RenderState {
 Blend Alpha
}

Полный пример J3MD

Включен полный пример файла J3MD, использующего все функции:

MaterialDef Test Material 123 {
  MaterialParameters {
    Float m_Shininess
    Texture2D m_MyTex
  }
  Technique {
    VertexShader GLSL100 : Common/MatDefs/Misc/MyShader.vert
    FragmentShader GLSL100 : Common/MatDefs/Misc/MyShader.frag
    WorldParameters {
      Time
    }
    RenderState {
      Blend Alpha
    }
  }
}

Файлы Экземпляра Материала (J3M)((Material instance))

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

Все файлы J3M начинаются со слова «Material», за которым следует имя материала (еще раз, используется только для отладки). После имени указывается двоеточие и полный путь к файлу расширенного или внедренного файла описания материала (J3MD), за которым следует фигурная скобка.

Пример:

Material MyGrass : Common/MatDefs/Misc/TestMaterial.j3md {

Описание материала является обязательным компонентом. В зависимости от используемого описания материала, внешний вид и функциональность материала полностью изменяются. В то время как описание материала обеспечивало «логику для материала», экземпляр материала предоставляет конфигурацию того, как эта логика работает.

J3M файл содержит только одну структуру; MaterialParameters, аналогично структуре с тем же именем в файле J3MD. В то время как в файле J3MD указаны имена и типы параметров, в файле J3M задаются значения этих параметров. Изменяя параметры, конфигурация родительского J3MD изменяется, позволяя достичь другого эффекта.

Чтобы указать значение параметра, сначала необходимо указать имя параметра, затем двоеточие и затем значение параметра. Для параметров текстуры это полный путь к файлу изображения. При желании для пути может быть задано слово «Flip»(Перевернуть), чтобы переворачивать изображение вдоль оси Y, это может понадобиться для некоторых моделей.

Пример блока MaterialParameters в J3M:

MaterialParameters {
  m_Shininess : 20.0
}
Тип параметра  Пример значения
Int  123
Boolean  true
Float  0.1
Vector2  0.1 5.6
Vector3  0.1 5.6 2.99
Vector4=Color  0.1 5.6 2.99 3
Texture2D=TextureCubeMap  Textures/MyTex.jpg

Форматирование значения зависит от типа значения, указанного в расширенном файле J3MD. Примеры для каждого типа параметра:

Полный пример J3M

Material MyGrass : Common/MatDefs/Misc/TestMaterial.j3md {
  MaterialParameters {
    m_MyTex : Flip Textures/GrassTex.jpg
    m_Shininess : 20.0
  }
}

Java-интерфейс для J3M

С помощью классов в пакете com.jme3.material можно сгенерировать идентичный файл J3M с использованием кода Java. Специфика API Material в этом документе не будет представлена. Представленный выше файл J3M представлен следующим кодом Java:

// Создание экземпляра материала
Material mat = new Material(assetManager, "Common/MatDefs/Misc/
    TestMaterial.j3md");
// Загрузите текстуру. Укажите «true» для flip-флага в TextureKey
Texture tex =
assetManager.loadTexture(new TextureKey("Textures/GrassTex.jpg", true));
// Задайте параметры
mat.setTexture("MyTex", tex);
mat.setFloat("Shininess", 20.0f);

Вывод

Поздравляем вас с тем что вы смогли прочитать весь документ! Чтобы вознаградить ваши усилия, jMonkeyEngine.com предложит бесплатный приз, пожалуйста, свяжитесь с Momoko_Fan aka «Kirill Vainer с паролем» bananapie, чтобы требовать.


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

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

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