Создание октакля из Medieval Craft. Урок 1
Создание октакля из Medieval Craft. Урок 1
Доброго времени суток, я расскажу о работе с шейдерами и материалами в окружении InnerCore
В одном из недавних обновлений 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, который будет использовать эти материалы.
Comments