~3 мин чтения

Рендеринг и материалы

Forward+/Mobile/Compatibility, BaseMaterial3D, gdshader — как Godot рисует кадр.

Три рендерера

Godot выбирает рендерер при создании проекта (можно сменить позже, но материалы могут требовать адаптации):

RendererAPIНазначение
Forward+Vulkan / Metal / D3D12Hi-end. Clustered Forward+, SDFGI, volumetric fog, SSR, SSAO/SSIL.
MobileVulkan / Metal / D3D12Мобильные, VR. Single-pass forward, лимит light’ов на меш.
CompatibilityOpenGL 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% задач без написания шейдера. Главные свойства:

  • Albedoalbedo_color + albedo_texture.
  • Metallic + Roughness — диффузный/металлический workflow.
  • Normal — карта нормалей.
  • Emission — самосветящийся цвет/текстура.
  • Ambient Occlusion — карта AO.
  • TransparencyOPAQUE / ALPHA / ALPHA_SCISSOR / ALPHA_DEPTH_PRE_PASS.
  • Cull ModeBACK / FRONT / DISABLED.
  • Texture filteringLINEAR / NEAREST.
var mat = StandardMaterial3D.new()  # StandardMaterial3D — наследник BaseMaterial3D
mat.albedo_color = Color.RED
mat.metallic = 0.5
mat.roughness = 0.3
$Mesh.material_override = mat
StandardMaterial3D, ORMMaterial3D

В 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, …).

Unity

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
Эффекты — только в Forward+

SSR, SSAO, SDFGI, volumetric fog — это features Forward+ рендера. На Mobile/Compatibility они отсутствуют или работают в урезанном виде. Если ваш проект таргетит веб — рассчитывайте на Compatibility-палитру.

В следующей главе — освещение подробнее.