Рендеринг и материалы
Forward+/Mobile/Compatibility, BaseMaterial3D, gdshader — как Godot рисует кадр.
Три рендерера
Godot выбирает рендерер при создании проекта (можно сменить позже, но материалы могут требовать адаптации):
| Renderer | API | Назначение |
|---|---|---|
| Forward+ | Vulkan / Metal / D3D12 | Hi-end. Clustered Forward+, SDFGI, volumetric fog, SSR, SSAO/SSIL. |
| Mobile | Vulkan / Metal / D3D12 | Мобильные, VR. Single-pass forward, лимит light’ов на меш. |
| Compatibility | OpenGL ES 3 / WebGL 2 | Слабое железо, единственный полноценный путь для веба. |
Project → Project Settings → Rendering → Renderer → Rendering Method.
Когда что
- Forward+ + Vulkan — десктоп, серьёзные 3D-проекты, hi-end visuals.
- Mobile + Vulkan/Metal — телефоны.
- Compatibility + WebGL 2 — браузер (это единственный путь для веб-таргета, который работает везде без COOP/COEP-заголовков).
Compatibility объявлен feature-complete с 4.3: lights, shadows, GI (lightmaps), GPU particles — всё доступно, с некоторыми ограничениями.
Mesh, Material, Shader
Та же триада, что и в Unity:
- Mesh — геометрия (вершины, нормали, UV). Импортируется из glTF/FBX/.obj/.dae.
- Shader — программа на GPU (
.gdshaderили встроенный движковый). - Material — экземпляр шейдера с параметрами.
В Godot нет файлов “Material” как у Unity — материал может быть встроен в Mesh-ресурс
(override material), либо сохранён отдельно как .tres.
BaseMaterial3D — стандартный PBR
Аналог Unity Standard / URP Lit. Готовый PBR-материал, который покрывает 90% задач без написания шейдера. Главные свойства:
- Albedo —
albedo_color+albedo_texture. - Metallic + Roughness — диффузный/металлический workflow.
- Normal — карта нормалей.
- Emission — самосветящийся цвет/текстура.
- Ambient Occlusion — карта AO.
- Transparency —
OPAQUE/ALPHA/ALPHA_SCISSOR/ALPHA_DEPTH_PRE_PASS. - Cull Mode —
BACK/FRONT/DISABLED. - Texture filtering —
LINEAR/NEAREST.
var mat = StandardMaterial3D.new() # StandardMaterial3D — наследник BaseMaterial3D
mat.albedo_color = Color.RED
mat.metallic = 0.5
mat.roughness = 0.3
$Mesh.material_override = mat
В Inspector видны StandardMaterial3D (использует отдельные карты для AO/Roughness/Metallic) и
ORMMaterial3D (одна карта с тремя каналами для AO/Roughness/Metallic — ORM). Оба — наследники
абстрактного BaseMaterial3D. Для совместимости с стандартом glTF — используйте ORM.
ShaderMaterial — кастомный шейдер
Когда BaseMaterial3D не хватает, делаете ShaderMaterial с собственным .gdshader-ресурсом:
// dissolve.gdshader
shader_type spatial;
uniform sampler2D albedo : source_color, filter_linear_mipmap;
uniform sampler2D noise;
uniform float threshold : hint_range(0.0, 1.0) = 0.5;
uniform vec3 edge_color : source_color = vec3(1.0, 0.5, 0.0);
void fragment() {
vec4 base = texture(albedo, UV);
float n = texture(noise, UV).r;
if (n < threshold) {
discard; // не рисовать этот пиксель
}
if (n < threshold + 0.05) {
ALBEDO = edge_color; // светящаяся граница
EMISSION = edge_color * 2.0;
} else {
ALBEDO = base.rgb;
}
}
Применение:
var shader = preload("res://shaders/dissolve.gdshader")
var mat = ShaderMaterial.new()
mat.shader = shader
mat.set_shader_parameter("threshold", 0.7)
mat.set_shader_parameter("albedo", preload("res://textures/wall.png"))
$Mesh.material_override = mat
GLSL ES 3.0 / WebGL — то же самое, только в Godot вокруг шейдера обёртка с shader_type,
встроенными переменными (UV, NORMAL, ALBEDO, ALPHA, EMISSION, ROUGHNESS, NORMAL_MAP, …).
HLSL + ShaderLab в Unity ↔ .gdshader (GLSL ES 3.0 dialect) в Godot. Синтаксис другой, идея
та же. Godot Shader Language проще читать новичку: меньше boilerplate, чем Unity URP Lit shader.
shader_type — категории
В Godot шейдеры явно категоризированы по типу через директиву:
shader_type spatial;— для 3D-мешей.shader_type canvas_item;— для 2D и Control.shader_type particles;— для частиц (process material).shader_type sky;— для skybox.shader_type fog;— для volumetric fog (Forward+).
Каждый тип имеет свои входы/выходы и встроенные переменные.
Visual Shader
Godot имеет встроенный визуальный шейдерный редактор — Visual Shader, значительно переработанный в 4.x (последовательные улучшения UX и нод-каталога). Создаётся через FileSystem → New Resource → VisualShader. Аналог Unity Shader Graph.
Удобен для тех, кто не пишет код шейдеров; собирает граф нод (Texture, Multiply, Mix, …). Под
капотом генерирует тот же .gdshader.
Draw calls и batching
В отличие от Unity, у Godot нет настроек “Static Batching” / “GPU Instancing” на материалах в явном виде. Но:
- MultiMeshInstance3D — нод, который рисует N экземпляров одного меша одним draw call’ом
(через
MultiMesh-ресурс). Аналог GPU Instancing. Применение: трава, ассеты декораций, толпы. - RenderingServer автоматически батчит draw call’ы, где может.
var mm = MultiMesh.new()
mm.transform_format = MultiMesh.TRANSFORM_3D
mm.instance_count = 1000
mm.mesh = preload("res://grass.obj")
for i in 1000:
var transform = Transform3D()
transform.origin = Vector3(randf_range(-50, 50), 0, randf_range(-50, 50))
mm.set_instance_transform(i, transform)
$MultiMeshInstance3D.multimesh = mm
Post-processing
В Godot нет Unity-стиля Volume Framework. Post-processing настраивается через WorldEnvironment узел и его ресурс Environment:
- Background — skybox / colored / camera_feed.
- Ambient Light.
- Glow (bloom).
- Tonemap — Linear / Reinhard / Filmic / ACES / AgX.
- SSR (Forward+).
- SSAO / SSIL (Forward+).
- SDFGI (Forward+) — динамическая GI.
- DOF (depth of field).
- Adjustments — Brightness/Contrast/Saturation/Color Correction LUT.
- Glow, Volumetric Fog.
Один WorldEnvironment на сцену. Чтобы переключать (например, при входе в пещеру), есть Camera3D → Environment Override или меняйте через скрипт.
var env = $WorldEnvironment.environment
env.tonemap_mode = Environment.TONE_MAPPER_ACES
env.glow_enabled = true
env.glow_intensity = 0.6
SSR, SSAO, SDFGI, volumetric fog — это features Forward+ рендера. На Mobile/Compatibility они отсутствуют или работают в урезанном виде. Если ваш проект таргетит веб — рассчитывайте на Compatibility-палитру.
В следующей главе — освещение подробнее.