Decal

Наследует: VisualInstance3D < Node3D < Node < Object

Узел, который проецирует текстуру на MeshInstance3D.

Описание

Decals-ы используются для проецирования текстуры на Mesh в сцене. Используйте Decals, чтобы добавить детали к сцене, не затрагивая базовую Mesh. Они часто используются для добавления выветривания к зданию, добавления грязи или ила на землю или добавления разнообразия к реквизиту. Decals можно перемещать в любое время, что делает их подходящими для таких вещей, как тени-капли или точки лазерного прицела.

Они сделаны из AABB и группы Texture2D, определяющих Color, normal, ORM (окклюзия окружения, шероховатость, металлик) и излучение. Декали проецируются в пределах их AABB, поэтому изменение ориентации декали влияет на направление, в котором они проецируются. По умолчанию декали проецируются вниз (т. е. от положительного Y к отрицательному Y).

Texture2D-ы, связанные с Decal, автоматически сохраняются в атласе текстур, который используется для рисования декалей, чтобы все декали можно было нарисовать одновременно. Godot использует кластеризованные декали, то есть они хранятся в кластерных данных и рисуются при рисовании сетки, а не рисуются как эффект постобработки после.

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

Примечание: Декали поддерживаются только в методах рендеринга Forward+ и Mobile, а не Compatibility. При использовании метода рендеринга Mobile на каждом ресурсе сетки может отображаться только 8 декалей. Попытка отобразить более 8 декалей на одном ресурсе сетки приведет к мерцанию декалей при движении камеры.

Примечание: При использовании метода рендеринга Mobile декали будут правильно влиять только на сетки, видимость AABB которых пересекается с AABB декали. Если используется шейдер для деформации сетки таким образом, что она выходит за пределы AABB, GeometryInstance3D.extra_cull_margin должен быть увеличен на сетке. В противном случае декаль может быть не видна на сетке.

Свойства

float

albedo_mix

1.0

int

cull_mask

1048575

float

distance_fade_begin

40.0

bool

distance_fade_enabled

false

float

distance_fade_length

10.0

float

emission_energy

1.0

float

lower_fade

0.3

Color

modulate

Color(1, 1, 1, 1)

float

normal_fade

0.0

Vector3

size

Vector3(2, 2, 2)

Texture2D

texture_albedo

Texture2D

texture_emission

Texture2D

texture_normal

Texture2D

texture_orm

float

upper_fade

0.3

Методы

Texture2D

get_texture(type: DecalTexture) const

void

set_texture(type: DecalTexture, texture: Texture2D)


Перечисления

enum DecalTexture: 🔗

DecalTexture TEXTURE_ALBEDO = 0

Texture2D соответствует texture_albedo.

DecalTexture TEXTURE_NORMAL = 1

Texture2D соответствует texture_normal.

DecalTexture TEXTURE_ORM = 2

Texture2D соответствует texture_orm.

DecalTexture TEXTURE_EMISSION = 3

Texture2D соответствует texture_emission.

DecalTexture TEXTURE_MAX = 4

Максимальный размер перечисления DecalTexture.


Описания свойств

float albedo_mix = 1.0 🔗

  • void set_albedo_mix(value: float)

  • float get_albedo_mix()

Смешивает альбедо Color декали с альбедо Color базовой сетки. Это можно установить на 0.0, чтобы создать декаль, которая влияет только на нормаль или ORM. В этом случае текстура альбедо все еще требуется, так как ее альфа-канал определит, где будут переопределены нормаль и ORM. См. также modulate.


int cull_mask = 1048575 🔗

  • void set_cull_mask(value: int)

  • int get_cull_mask()

Указывает, на какой VisualInstance3D.layers будет проецироваться эта декаль. По умолчанию Decals влияет на все слои. Это используется, чтобы вы могли указать, какие типы объектов получают Decal, а какие нет. Это особенно полезно, чтобы вы могли гарантировать, что динамические объекты случайно не получат Decal, предназначенный для ландшафта под ними.


float distance_fade_begin = 40.0 🔗

  • void set_distance_fade_begin(value: float)

  • float get_distance_fade_begin()

Расстояние от камеры, на котором декаль начинает исчезать (в 3D-единицах).


bool distance_fade_enabled = false 🔗

  • void set_enable_distance_fade(value: bool)

  • bool is_distance_fade_enabled()

Если true, декали будут плавно исчезать при удалении от активной Camera3D, начиная с distance_fade_begin. Декаль будет исчезать через distance_fade_begin + distance_fade_length, после чего она будет отбракована и вообще не отправлена в шейдер. Используйте это, чтобы уменьшить количество активных декалей в сцене и тем самым повысить производительность.


float distance_fade_length = 10.0 🔗

  • void set_distance_fade_length(value: float)

  • float get_distance_fade_length()

Расстояние, на котором декаль исчезает (в 3D-единицах). Декаль постепенно становится более прозрачной на этом расстоянии и полностью невидимой в конце. Более высокие значения приводят к более плавному переходу затухания, что больше подходит для случаев, когда камера движется быстро.


float emission_energy = 1.0 🔗

  • void set_emission_energy(value: float)

  • float get_emission_energy()

Множитель энергии для текстуры излучения. Это заставит декаль излучать свет с большей или меньшей интенсивностью, независимо от цвета альбедо. См. также modulate.


float lower_fade = 0.3 🔗

  • void set_lower_fade(value: float)

  • float get_lower_fade()

Устанавливает кривую, по которой декаль будет исчезать по мере удаления поверхности от центра AABB. Допустимы только положительные значения (отрицательные значения будут ограничены 0.0). См. также upper_fade.


Color modulate = Color(1, 1, 1, 1) 🔗

  • void set_modulate(value: Color)

  • Color get_modulate()

Изменяет Color декали, умножая цвета альбедо и излучения на это значение. Альфа-компонент учитывается только при умножении цвета альбедо, а не цвета излучения. См. также emission_energy и albedo_mix, чтобы изменить интенсивность излучения и альбедо независимо друг от друга.


float normal_fade = 0.0 🔗

  • void set_normal_fade(value: float)

  • float get_normal_fade()

Затемняет декаль, если угол между AABB декали и целевой поверхностью становится слишком большим. Значение 0 проецирует декаль независимо от угла, значение 1 ограничивает декаль поверхностями, которые почти перпендикулярны.

Примечание: Установка normal_fade на значение больше 0.0 имеет небольшие затраты производительности из-за дополнительных вычислений угла нормали.


Vector3 size = Vector3(2, 2, 2) 🔗

Устанавливает размер AABB, используемый наклейкой. Все размеры должны быть установлены на значение больше нуля (они будут ограничены 0.001, если это не так). AABB изменяется от -size/2 до size/2.

Примечание: Чтобы повысить эффективность отбраковки наклеек «твердой поверхности», установите их upper_fade и lower_fade на 0.0 и установите компонент Y size как можно ниже. Это уменьшит размер AABB наклеек, не влияя на их внешний вид.


Texture2D texture_albedo 🔗

Texture2D с базовым Color Decal. Либо это, либо texture_emission должно быть установлено, чтобы Decal был видимым. Используйте альфа-канал как маску, чтобы плавно смешать края decal с базовым объектом.

Примечание: В отличие от BaseMaterial3D, режим фильтра которого можно настраивать для каждого материала, режим фильтра для текстур Decal устанавливается глобально с помощью ProjectSettings.rendering/textures/decals/filter.


Texture2D texture_emission 🔗

Texture2D с излучением Color Decal. Либо это, либо texture_albedo должно быть установлено, чтобы Decal был видимым. Используйте альфа-канал как маску, чтобы плавно смешать края decal с нижележащим объектом.

Примечание: В отличие от BaseMaterial3D, режим фильтра которого можно настраивать для каждого материала, режим фильтра для текстур Decal устанавливается глобально с помощью ProjectSettings.rendering/textures/decals/filter.


Texture2D texture_normal 🔗

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

Примечание: В отличие от BaseMaterial3D, режим фильтра которого можно настраивать для каждого материала, режим фильтра для текстур Decal устанавливается глобально с помощью ProjectSettings.rendering/textures/decals/filter.

Примечание: Установка только этой текстуры не приведет к появлению видимой декали, так как texture_albedo также должен быть установлен. Чтобы создать декаль только для нормалей, загрузите текстуру альбедо в texture_albedo и установите albedo_mix на 0.0. Альфа-канал текстуры альбедо будет использоваться для определения того, где должна быть переопределена карта нормалей базовой поверхности (и ее интенсивность).


Texture2D texture_orm 🔗

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

Примечание: В отличие от BaseMaterial3D, режим фильтра которого можно настраивать для каждого материала, режим фильтра для текстур Decal устанавливается глобально с помощью ProjectSettings.rendering/textures/decals/filter.

Примечание: Установка только этой текстуры не приведет к появлению видимой декали, так как texture_albedo также должен быть установлен. Чтобы создать декаль только для ORM, загрузите текстуру альбедо в texture_albedo и установите albedo_mix на 0.0. Альфа-канал текстуры альбедо будет использоваться для определения того, где должна быть переопределена карта ORM подстилающей поверхности (и ее интенсивность).


float upper_fade = 0.3 🔗

  • void set_upper_fade(value: float)

  • float get_upper_fade()

Устанавливает кривую, по которой декаль будет исчезать по мере удаления поверхности от центра AABB. Допустимы только положительные значения (отрицательные значения будут ограничены 0.0). См. также lower_fade.


Описания метода

Texture2D get_texture(type: DecalTexture) const 🔗

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

Например, вместо albedo_tex = $Decal.get_texture(Decal.TEXTURE_ALBEDO), используйте albedo_tex = $Decal.texture_albedo.

Один случай, когда это лучше, чем прямой доступ к текстуре, — это когда вы хотите скопировать текстуры одной Decal в другую. Например:

for i in Decal.TEXTURE_MAX:
    $NewDecal.set_texture(i, $OldDecal.get_texture(i))

void set_texture(type: DecalTexture, texture: Texture2D) 🔗

Устанавливает Texture2D, связанный с указанным DecalTexture. Это удобный метод, в большинстве случаев вам следует обращаться к текстуре напрямую.

Например, вместо $Decal.set_texture(Decal.TEXTURE_ALBEDO, albedo_tex), используйте $Decal.texture_albedo = albedo_tex.

Один случай, когда это лучше, чем прямой доступ к текстуре, — это когда вы хотите скопировать текстуры одной Decal в другую. Например:

for i in Decal.TEXTURE_MAX:
    $NewDecal.set_texture(i, $OldDecal.get_texture(i))