Как изменить насыщенность и наложение спрайта в Годо - PullRequest
0 голосов
/ 30 января 2020

Я планировал изменить свой спрайт на более темный цвет, изменив значения насыщенности и оттенка. Но это кажется очень сложным, поскольку модули Godot говорят только об изменении цвета спрайта, хотя опция modulate выглядит следующим образом:

node.modulate= Color(0, 50, 2,0.5)

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

В настоящее время я могу делать только «Наложение цвета» без изменения прозрачности. Любой способ добавления цветового наложения с изменением непрозрачности был бы полезен, если только он не изменяет непрозрачность всего спрайта, а только цвет наложения.

Я работаю над 2D игра с импортированными PNG Sprites. Если потребуется дополнительная информация, я с удовольствием предоставлю ее.

Дополнительная информация -

Как выглядит мой спрайт

enter image description here

Я хочу сделать код темнее в два раза, как это -

enter image description here enter image description here

By do node.modulate = Color (0.0, 0.0, 0.0,1) становится так: enter image description here

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

1 Ответ

1 голос
/ 05 февраля 2020

Example color difference image

Вот два примера того, как вы можете затемнить спрайт с помощью кода.

Первый способ - использование self_modulate. Модуляция рассчитывается путем умножения значения модуляции на значение цвета текстуры. Это показывает, что модуляция (1, 1, 1, 1) совпадает с исходной текстурой. Модуляция (0.5, 0.5, 0.5, 1) делит текстуру пополам пополам, делая ее темнее, как если бы она имела черное наложение наполовину непрозрачности.

# On a node that extends CanvasItem
self_modulate = Color(0.5, 0.5, 0.5, 1.0)

Второй метод - вычесть значение текстуры из константы. Это создает более насыщенную, но темную текстуру.

Код шейдера:

shader_type canvas_item;

uniform float difference: hint_range(0.0, 1.0) = 0.0;

void fragment() {
    vec4 tex = texture(TEXTURE, UV);
    COLOR.rgb = tex.rgb - vec3(difference);
    COLOR.a = tex.a;
}

Другой код:

# On a node that extends CanvasItem
material.set_shader_param('difference', 0.3)

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

Надеюсь, это поможет.

...