Скачать Extended Shaders — Minecraft Моды — MetaMods

Extended Shaders

Активный

Установок

0

Последнее обновление

3 года назад
Клиент
Библиотеки

Extended Shaders

API для работы с шейдерами в модах

Extended Shaders представляет собой API в виде кор-мода, который предоставляет разработчикам модов возможность использовать шейдеры и эффекты постобработки в своих проектах. Это решение избавляет от необходимости глубокого погружения в создание кор-модов и обеспечивает совместимость с другими модификациями, использующими данную систему.

Требования к разработчикам

Для работы с API необходимо уверенное владение языком GLSL, включая профиль совместимости GLSL, который используется в данной системе. Без этих знаний эффективное использование инструмента невозможно.

Совместимость с Optifine

Мод полностью совместим с Optifine, однако эффекты постобработки будут работать только при отключенной опции "быстрый рендер". При установленном Optifine шейдеры активируются через меню выбора шейдерпаков, где нужно выбрать 'Extended Shaders'. Без Optifine управление шейдерами осуществляется через меню "Настройки видео".

Системные требования

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

Руководство для разработчиков

Создание вершинного шейдера

1. Создайте файл в ресурсах вашего мода со списком uniform-переменных, переменных и констант:

uniform float burnAmount; // uniform-переменная
varying vec4 fragCol; // переменная
#define col vec3(.976, .969, .816) // константа

2. Создайте файл с кодом шейдера:

fragCol = fragCol  col;

3. Создайте экземпляр ShaderData:

vertShader = new ShaderData(new ResourceLocation(modid, uniformslocation), new ResourceLocation(modid, codelocation), uniform name 1, uniform name 2, ...);

4. Для активации:

ShaderRegistry.addVertexShader(vertShader);

5. Для деактивации:

ShaderRegistry.removeVertexShader(vertShader);

Создание фрагментного шейдера

1. Создайте файл со списком uniform-переменных, переменных и констант:

uniform float burnAmount; // uniform-переменная
varying vec2 textureCoords; // переменная
#define col vec3(.976, .969, .816) // константа

2. Создайте файл с кодом шейдера (работа через gl_fragData[0]):

float depth = sqrt(eyePos.x  eyePos.x + eyePos.y  eyePos.y + eyePos.z  eyePos.z);
if (depth > 64.0) discard;
depth = clamp(depth / 64.0, 0, 1);
float val = (max(max(gl_FragData[0].r, gl_FragData[0].g), gl_FragData[0].b) + min(min(gl_FragData[0].r, gl_FragData[0].g), gl_FragData[0].b))  .25;
gl_FragData[0] = vec4(vec3(1.0) - col  (depth + val - depth  val), gl_FragData[0].a);

3. Создайте экземпляр ShaderData:

fragShader = new ShaderData(new ResourceLocation(modid, uniformslocation), new ResourceLocation(modid, codelocation), uniform name 1, uniform name 2, ...);

4. Для активации:

ShaderRegistry.addFragmentShader(fragShader);

5. Для деактивации:

ShaderRegistry.removeFragmentShader(fragShader);

Создание пост-процессора

1. Создайте файл со списком uniform-переменных и констант:

uniform float currentTime; // uniform-переменная
#define rad 3.0 // константа

2. Создайте файл с кодом пост-процессора:

float tx1 = rad  dx;
float tx2 = tx1  .5;
float ty = rad  .5  sqrt(3.0)  dy;
vec3 cp1 = texture2D(tex0, texCoords).rgb;
vec3 cp1 = texture2D(tex0, texCoords + vec2(tx1, 0)).rgb;
vec3 cp3 = texture2D(tex0, texCoords + vec2(tx2, ty)).rgb;
vec3 cp4 = texture2D(tex0, texCoords + vec2(-tx2, ty)).rgb;
vec3 cp5 = texture2D(tex0, texCoords + vec2(-tx1, 0)).rgb;
vec3 cp6 = texture2D(tex0, texCoords + vec2(-tx2, -ty)).rgb;
vec3 cp7 = texture2D(tex0, texCoords + vec2(tx2, -ty)).rgb;
gl_FragData[0] = vec4((cp1 + cp2 + cp3 + cp4 + cp5 + cp6 + cp7) / 7, 1);

3. Создайте экземпляр PostProcessor:

postProcessor = new PostProcessor(new ResourceLocation(modid, uniformslocation), new ResourceLocation(modid, codelocation), uniform name 1, uniform name 2, ...);

4. Для активации:

PostProcessorRegistry.addPostProcessor(postProcessor);

5. Для деактивации:

PostProcessorRegistry.removePostProcessor(postProcessor);

API также поддерживает приоритеты для шейдеров и пост-процессоров. Для получения информации о расширенных функциях изучите документацию API.

Участники проекта
FirEmerald

FirEmerald

Создан: 16 мая 2022

ID: 36601