Создание октакля из Medieval Craft. Урок 1

Создание октакля из Medieval Craft. Урок 1

Доброго времени суток, я расскажу о работе с шейдерами и материалами в окружении InnerCore

octacle

В одном из недавних обновлений Inner Core были введены материалы. Материалы представляют собой совокупность параметров, определяющих способ визуализации анимации, к которой прикреплён этот материал. Все материалы необходимо располагать по пути /res/custom-materials/, где res – директория ресурсов, указанная в make.json или build.config. Очень важно, чтобы перед названием файла материала была приставка вашего мода, чтобы гарантировать уникальность. Материалы описываются с помощью JSON файлов с расширением .material в таком виде:

{
    "material1:base_material":
    {
        params1:value,
        params2:value
    },
     "material2:base_material":
    {
        params1:value,
        params2:value
    },
} 

Стоит учесть то, что материалы из разных модов с одинаковым именем будут конфликтовать, потому стоит называть материалы в следующем формате: мод_материал. Строчка “material1:base_material” создаёт материал с названием material1, который наследуется от base_material. В контексте материалов механизм наследования обеспечивает копирование параметров в дочерний материал. Для материалов есть несколько видов параметров: передающиеся в шейдер, передающиеся непосредственно внутрь OpenGl и параметры sampler. Sampler представляет собой тип данных GLSL, в котором хранятся текстуры. С помощью параметров материала можно регулировать параметры наложения текстуры, снизу можно увидеть примеры: “textureWrap”:”Clamp” (слева) и “textureWrap”:”Repeat” (справа).

Параметры sampler записываются в таком формате (плюс в названии параметра не опечатка, он действительно нужен):
(ВАЖНО!) Комментарии нельзя вставлять в файл материала, здесь они даны для примера.

"+samplerStates": [
        {
          // Индекс sampler (у одного шейдера их может быть несколько).
          "samplerIndex": 0,
          // Тип наложения текстуры.
          "textureWrap": "Repeat",
          // Тип сглаживания текстуры.
          "textureFilter": "Bilinear"
        }
],

Заглянув в шейдеры Minecraft, можно увидеть такие строки:

#ifdef TINTED_ALPHA_TEST
    varying float alphaTestMultiplier;
#endif

Это директивы, определяющие выборочное исполнение кода шейдера. В данном случае эти строки означают, что если параметр TINTED_ALPHA_TEST активен, то код внутри директивы будет исполнен. Как же активировать этот параметр? Это делается всё также внутри материала. Ниже дан пример с активацией данного параметра для материала:

"+defines": [ "TINTED_ALPHA_TEST" ]

Также есть параметры, передающиеся в OpenGL. Например, ниже код, позволяющий сделать полупрозрачный материал:
(ВАЖНО!) Комментарии нельзя вставлять в файл материала, здесь они даны для примера.

"+states": [
    // Включает смешивание.
    "Blending",
    // Показывает полигоны с двух сторон (в нормальном стороне отрисовывается только та сторона, нормаль которой направлена на наблюдателя).
    "DisableCulling",
    // Отключает запись глубины (из-за этого возникают различные проблема, как например частицы, отрисовывающиеся за водой).
    "DisableDepthWrite"
]

Ну и наконец, самая важная часть. Установка шейдеров для материала, это то, что вам обязательно понадобится:
(ВАЖНО!) Комментарии нельзя вставлять в файл материала, здесь они даны для примера.

// Установка вершинного шейдера.
"vertexShader": "shaders/entity.vertex",
// Установка фрагментного шейдера.
"fragmentShader": "shaders/entity.fragment",
// Установка геометрического шейдера.
"vrGeometryShader": "shaders/uv.geometry"

Необходимо более подробно остановится на использовании собственных шейдеров. Для того чтобы указать свой шейдер необходимо использовать такой формат: “./путь_к_шейдеру_и_имя”. Например, для шейдера mc_octacle.fragment, который находится в папке custom-shaders нужно создать такую запись: “./mc_octacle.fragment”. Для встроенных в Minecraft и InnerCore шейдеров следует использовать такую запись: “shaders/путь_к_шейдеру_и_имя”, например “shaders/entity.vertex”.

Поскольку стандартным материалом для предметов в интерфейсе является ui_custom_item, а для моделей в руке и моделей в мире entity_alphatest, разумно использовать их как родительский материал для соответствующих пользовательских материалов, если те не требуют кардинального изменения свойств.

Кроме всего вышесказанного, необходимо обратить внимание на то, что если в файле материала или шейдера ошибка, то объект, на который наложен данный материал НЕ БУДЕТ ОТРИСОВАН, никаких ошибок вам Minecraft или InnerCore НЕ ПОКАЖЕТ.

После теории пора приступать к практике. В прошлом уроке я создал 2 шейдера, теперь я буду их использовать. Создаю файл medieval_craft_octacle.material в папке custom-materials. После этого мне необходимо добавить два материала: для подожжённого октакля и для обычного. Им я установлю соответствующие шейдеры и настройки для OpenGL, которые позволят моему октаклю иметь полупрозрачность:

{
      "octacle_fired": {
            "vertexShader": "shaders/entity.vertex",
            "fragmentShader": "custom-shaders/mc_octacle_fired.fragment",
            "+states": [
                  "Blending",
                  "DisableCulling"
            ]
      },
      "octacle_normal:entity_alphatest": {
            "vertexShader": "shaders/entity.vertex",
            "fragmentShader": "./mc_octacle.fragment",
            "+states": [
                  "Blending",
                  "DisableCulling"
            ]
      }
}

Для того чтобы использовать данный материал в анимации, необходмио указать название материала для поля material у анимации: material: “octacle_fired”.
На этом всё, в следующем уроке я создам блок и TileEntity, который будет использовать эти материалы.

This entry was posted in InnerCore. Bookmark the permalink.

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *