Post Processing
Π‘ΠΈΡΡΠ΅ΠΌΠ° ΠΏΠΎΡΡΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ
Wudgine ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π΅Ρ ΠΌΠΎΡΠ½ΡΡ ΡΠΈΡΡΠ΅ΠΌΡ ΠΏΠΎΡΡΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ Π΄Π»Ρ ΡΠ»ΡΡΡΠ΅Π½ΠΈΡ Π²ΠΈΠ·ΡΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΊΠ°ΡΠ΅ΡΡΠ²Π° ΡΠ΅Π½Π΄Π΅ΡΠΈΠ½Π³Π°. ΠΡΡΠ΅ΠΊΡΡ ΠΏΠΎΡΡΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡΡΡ ΠΊ ΡΠΈΠ½Π°Π»ΡΠ½ΠΎΠΌΡ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΠΏΠΎΡΠ»Π΅ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠ³ΠΎ ΡΠ΅Π½Π΄Π΅ΡΠΈΠ½Π³Π° ΡΡΠ΅Π½Ρ.
Π‘ΡΠ΅ΠΊ ΠΏΠΎΡΡΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ
// ΠΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΡΠ΅ΠΊΠ° ΠΏΠΎΡΡΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ
auto& postProcess = renderer.getPostProcessStack();
// ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΡΡΡΠ΅ΠΊΡΠΎΠ²
postProcess.addEffect<BloomEffect>();
postProcess.addEffect<TonemappingEffect>();
postProcess.addEffect<ColorGradingEffect>();
postProcess.addEffect<VignetteEffect>();
// ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° ΠΏΠΎΡΡΠ΄ΠΊΠ° ΡΡΡΠ΅ΠΊΡΠΎΠ²
postProcess.setEffectOrder({
PostProcessEffectType::Bloom,
PostProcessEffectType::SSAO,
PostProcessEffectType::Tonemapping,
PostProcessEffectType::ColorGrading,
PostProcessEffectType::Vignette
});
// ΠΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅/ΠΎΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΡΡΠ΅ΠΊΡΠΎΠ²
postProcess.enableEffect(PostProcessEffectType::Bloom, true);
postProcess.enableEffect(PostProcessEffectType::Vignette, false);
ΠΡΠ½ΠΎΠ²Π½ΡΠ΅ ΡΡΡΠ΅ΠΊΡΡ
Bloom
Bloom ΡΠΎΠ·Π΄Π°Π΅Ρ ΡΡΡΠ΅ΠΊΡ ΡΠ²Π΅ΡΠ΅Π½ΠΈΡ Π²ΠΎΠΊΡΡΠ³ ΡΡΠΊΠΈΡ ΠΎΠ±Π»Π°ΡΡΠ΅ΠΉ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ, ΠΈΠΌΠΈΡΠΈΡΡΡ ΡΠ°ΡΡΠ΅ΠΈΠ²Π°Π½ΠΈΠ΅ ΡΠ²Π΅ΡΠ° Π² ΠΎΠ±ΡΠ΅ΠΊΡΠΈΠ²Π΅ ΠΊΠ°ΠΌΠ΅ΡΡ.
// ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° ΡΡΡΠ΅ΠΊΡΠ° Bloom
auto& bloom = postProcess.addEffect<BloomEffect>();
bloom.setThreshold(1.0f); // ΠΠΎΡΠΎΠ³ ΡΡΠΊΠΎΡΡΠΈ Π΄Π»Ρ Π½Π°ΡΠ°Π»Π° ΡΡΡΠ΅ΠΊΡΠ°
bloom.setIntensity(0.5f); // ΠΠ½ΡΠ΅Π½ΡΠΈΠ²Π½ΠΎΡΡΡ ΡΡΡΠ΅ΠΊΡΠ°
bloom.setScatter(0.7f); // Π Π°ΡΡΠ΅ΠΈΠ²Π°Π½ΠΈΠ΅ ΡΠ²Π΅ΡΠ΅Π½ΠΈΡ
bloom.setRadius(4); // Π Π°Π΄ΠΈΡΡ ΡΠ°Π·ΠΌΡΡΠΈΡ

Tonemapping
Π’ΠΎΠ½ΠΌΠ°ΠΏΠΏΠΈΠ½Π³ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ΅Ρ HDR (High Dynamic Range) ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π² LDR (Low Dynamic Range) Π΄Π»Ρ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ Π½Π° ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΡ ΠΌΠΎΠ½ΠΈΡΠΎΡΠ°Ρ .
// ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° ΡΡΡΠ΅ΠΊΡΠ° Tonemapping
auto& tonemap = postProcess.addEffect<TonemappingEffect>();
tonemap.setOperator(TonemappingOperator::ACES); // ACES, Reinhard, Uncharted2, Filmic
tonemap.setExposure(1.0f); // ΠΠΊΡΠΏΠΎΠ·ΠΈΡΠΈΡ
tonemap.setGamma(2.2f); // ΠΠ°ΠΌΠΌΠ°-ΠΊΠΎΡΡΠ΅ΠΊΡΠΈΡ
- ACES: ΠΠΈΠ½Π΅ΠΌΠ°ΡΠΎΠ³ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΡΠΎΠ½ΠΌΠ°ΠΏΠΏΠΈΠ½Π³ Ρ Ρ ΠΎΡΠΎΡΠ΅ΠΉ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ΅ΠΉ ΡΠ²Π΅ΡΠΎΠ²
- Reinhard: ΠΡΠΎΡΡΠΎΠΉ ΠΈ Π±ΡΡΡΡΡΠΉ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ Ρ ΠΌΡΠ³ΠΊΠΈΠΌ ΡΠΆΠ°ΡΠΈΠ΅ΠΌ
- Uncharted2: ΠΠΏΠ΅ΡΠ°ΡΠΎΡ Ρ Ρ ΠΎΡΠΎΡΠ΅ΠΉ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ΅ΠΉ Π΄Π΅ΡΠ°Π»Π΅ΠΉ Π² ΡΠ΅Π½ΡΡ
- Filmic: ΠΠΏΠ΅ΡΠ°ΡΠΎΡ Ρ ΠΊΠΈΠ½Π΅ΠΌΠ°ΡΠΎΠ³ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΌ Π²Π½Π΅ΡΠ½ΠΈΠΌ Π²ΠΈΠ΄ΠΎΠΌ
Color Grading
Color Grading ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π½Π°ΡΡΡΠ°ΠΈΠ²Π°ΡΡ ΡΠ²Π΅ΡΠΎΠ²ΡΡ Π³Π°ΠΌΠΌΡ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ Π½Π°ΡΡΡΠΎΠ΅Π½ΠΈΡ ΠΈΠ»ΠΈ Π°ΡΠΌΠΎΡΡΠ΅ΡΡ.
// ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° ΡΡΡΠ΅ΠΊΡΠ° Color Grading
auto& colorGrading = postProcess.addEffect<ColorGradingEffect>();
colorGrading.setContrast(1.1f); // ΠΠΎΠ½ΡΡΠ°ΡΡ
colorGrading.setSaturation(1.2f); // ΠΠ°ΡΡΡΠ΅Π½Π½ΠΎΡΡΡ
colorGrading.setGain(Vector3(1.0f, 1.0f, 1.0f)); // Π£ΡΠΈΠ»Π΅Π½ΠΈΠ΅ RGB
colorGrading.setOffset(Vector3(0.0f, 0.0f, 0.1f)); // Π‘ΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ RGB
colorGrading.setLUT("assets/textures/luts/cinematic.png"); // ΠΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ LUT
LUT (Look-Up Table)
Π’Π°Π±Π»ΠΈΡΠ° ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ ΡΠ²Π΅ΡΠΎΠ² Π΄Π»Ρ Π±ΡΡΡΡΠΎΠ³ΠΎ ΠΈ ΡΠΎΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ ΡΠ²Π΅ΡΠΎΠ²ΡΡ ΡΡ Π΅ΠΌ.
Π¦Π²Π΅ΡΠΎΠ²ΡΠ΅ ΠΊΡΠΈΠ²ΡΠ΅
ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ ΠΊΠ°Π½Π°Π»ΠΎΠ² RGB Π΄Π»Ρ ΡΠΎΡΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ½ΡΡΠΎΠ»Ρ Π½Π°Π΄ ΡΠ²Π΅ΡΠ°ΠΌΠΈ.
Depth of Field
Depth of Field (Π³Π»ΡΠ±ΠΈΠ½Π° ΡΠ΅Π·ΠΊΠΎΡΡΠΈ) ΠΈΠΌΠΈΡΠΈΡΡΠ΅Ρ ΡΡΡΠ΅ΠΊΡ ΡΠΎΠΊΡΡΠΈΡΠΎΠ²ΠΊΠΈ ΠΊΠ°ΠΌΠ΅ΡΡ, ΡΠ°Π·ΠΌΡΠ²Π°Ρ ΠΎΠ±ΡΠ΅ΠΊΡΡ, Π½Π°Ρ ΠΎΠ΄ΡΡΠΈΠ΅ΡΡ Π²Π½Π΅ ΡΠΎΠΊΡΡΠ°.
// ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° ΡΡΡΠ΅ΠΊΡΠ° Depth of Field
auto& dof = postProcess.addEffect<DepthOfFieldEffect>();
dof.setFocalDistance(10.0f); // Π Π°ΡΡΡΠΎΡΠ½ΠΈΠ΅ ΡΠΎΠΊΡΡΠΈΡΠΎΠ²ΠΊΠΈ
dof.setFocalLength(50.0f); // Π€ΠΎΠΊΡΡΠ½ΠΎΠ΅ ΡΠ°ΡΡΡΠΎΡΠ½ΠΈΠ΅
dof.setAperture(2.8f); // ΠΠΈΠ°ΡΡΠ°Π³ΠΌΠ° (f-ΡΠΈΡΠ»ΠΎ)
dof.setBokehShape(BokehShape::Hexagon); // Π€ΠΎΡΠΌΠ° Π±ΠΎΠΊΠ΅
Motion Blur
Motion Blur ΡΠΎΠ·Π΄Π°Π΅Ρ ΡΡΡΠ΅ΠΊΡ ΡΠ°Π·ΠΌΡΡΠΈΡ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΡ, Π΄ΠΎΠ±Π°Π²Π»ΡΡ ΡΠ΅Π°Π»ΠΈΠ·ΠΌ Π±ΡΡΡΡΠΎ Π΄Π²ΠΈΠΆΡΡΠΈΠΌΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌ.
// ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° ΡΡΡΠ΅ΠΊΡΠ° Motion Blur
auto& motionBlur = postProcess.addEffect<MotionBlurEffect>();
motionBlur.setIntensity(0.3f); // ΠΠ½ΡΠ΅Π½ΡΠΈΠ²Π½ΠΎΡΡΡ ΡΠ°Π·ΠΌΡΡΠΈΡ
motionBlur.setSampleCount(8); // ΠΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΡΠΌΠΏΠ»ΠΎΠ²
motionBlur.setVelocityScale(1.0f); // ΠΠ°ΡΡΡΠ°Π± ΡΠΊΠΎΡΠΎΡΡΠΈ
// ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° Motion Blur ΠΊ ΠΎΠ±ΡΠ΅ΠΊΡΡ
auto& motionVector = entity.addComponent<MotionVectorComponent>();
motionVector.setVelocityMultiplier(1.0f);
// ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° Motion Blur Π΄Π»Ρ ΠΊΠ°ΠΌΠ΅ΡΡ
auto& camera = entity.getComponent<CameraComponent>();
camera.enableMotionBlur(true);
camera.setMotionBlurIntensity(0.5f);
Screen Space Ambient Occlusion (SSAO)
SSAO Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅Ρ ΡΠ΅Π°Π»ΠΈΡΡΠΈΡΠ½ΡΠ΅ ΠΌΡΠ³ΠΊΠΈΠ΅ ΡΠ΅Π½ΠΈ Π² ΡΠ³Π»Π°Ρ ΠΈ ΡΠ΅Π»ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ², ΡΠ»ΡΡΡΠ°Ρ Π²ΠΎΡΠΏΡΠΈΡΡΠΈΠ΅ Π³Π»ΡΠ±ΠΈΠ½Ρ ΡΡΠ΅Π½Ρ.
// ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° ΡΡΡΠ΅ΠΊΡΠ° SSAO
auto& ssao = postProcess.addEffect<SSAOEffect>();
ssao.setRadius(0.5f); // Π Π°Π΄ΠΈΡΡ ΡΡΡΠ΅ΠΊΡΠ°
ssao.setSampleCount(16); // ΠΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΡΠΌΠΏΠ»ΠΎΠ²
ssao.setPower(2.0f); // Π‘ΠΈΠ»Π° ΡΡΡΠ΅ΠΊΡΠ°
ssao.setBias(0.025f); // Π‘ΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠ΅Π½ΠΈΡ Π°ΡΡΠ΅ΡΠ°ΠΊΡΠΎΠ²
ssao.setBlurSize(4); // Π Π°Π·ΠΌΠ΅Ρ ΡΠ°Π·ΠΌΡΡΠΈΡ
ΠΡΡΠ³ΠΈΠ΅ ΡΡΡΠ΅ΠΊΡΡ
ΠΠΈΠ½ΡΠ΅ΡΠΊΠ°
ΠΠ°ΡΠ΅ΠΌΠ½Π΅Π½ΠΈΠ΅ ΠΊΡΠ°Π΅Π² ΡΠΊΡΠ°Π½Π° Π΄Π»Ρ ΡΠΎΠΊΡΡΠΈΡΠΎΠ²ΠΊΠΈ Π²Π½ΠΈΠΌΠ°Π½ΠΈΡ Π½Π° ΡΠ΅Π½ΡΡΠ΅.
Π₯ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠ°Ρ Π°Π±Π΅ΡΡΠ°ΡΠΈΡ
ΠΠΌΠΈΡΠ°ΡΠΈΡ ΠΎΠΏΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΠΈΡΠΊΠ°ΠΆΠ΅Π½ΠΈΡ, ΡΠ°Π·Π΄Π΅Π»ΡΡΡΠ΅Π³ΠΎ ΡΠ²Π΅ΡΠΎΠ²ΡΠ΅ ΠΊΠ°Π½Π°Π»Ρ.
ΠΠ΅ΡΠ½ΠΈΡΡΠΎΡΡΡ ΠΏΠ»Π΅Π½ΠΊΠΈ
ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΡΡΠΌΠ° Π΄Π»Ρ ΠΈΠΌΠΈΡΠ°ΡΠΈΠΈ Π·Π΅ΡΠ½ΠΈΡΡΠΎΡΡΠΈ ΡΠΎΡΠΎΠΏΠ»Π΅Π½ΠΊΠΈ.
Π‘ΠΊΠ°Π½Π»Π°ΠΉΠ½Ρ
ΠΠΌΠΈΡΠ°ΡΠΈΡ Π»ΠΈΠ½ΠΈΠΉ ΡΠ°Π·Π²Π΅ΡΡΠΊΠΈ ΡΡΠ°ΡΡΡ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΎΠ².
ΠΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠ΅ ΡΡΡΠ΅ΠΊΡΡ
Wudgine ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠ΅ ΡΡΡΠ΅ΠΊΡΡ ΠΏΠΎΡΡΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ:
// Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠ³ΠΎ ΡΡΡΠ΅ΠΊΡΠ°
class MyCustomEffect : public PostProcessEffect {
public:
MyCustomEffect() {
// ΠΠ°Π³ΡΡΠ·ΠΊΠ° ΡΠ΅ΠΉΠ΄Π΅ΡΠ°
shader = ShaderProgram::create("assets/shaders/post/custom_effect");
// Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ²
addParameter("intensity", 1.0f);
addParameter("color", Vector3(1.0f, 0.5f, 0.2f));
}
void render(const RenderContext& context) override {
// ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° ΡΠ΅ΠΉΠ΄Π΅ΡΠ°
shader.bind();
shader.setUniform("u_Intensity", getParameter<float>("intensity"));
shader.setUniform("u_Color", getParameter<Vector3>("color"));
shader.setUniform("u_SourceTexture", context.sourceTexture, 0);
// Π Π΅Π½Π΄Π΅ΡΠΈΠ½Π³ ΡΡΡΠ΅ΠΊΡΠ°
renderFullscreenQuad();
}
private:
ShaderProgram shader;
};
// ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠ³ΠΎ ΡΡΡΠ΅ΠΊΡΠ°
auto& customEffect = postProcess.addEffect<MyCustomEffect>();
customEffect.setParameter("intensity", 0.8f);
customEffect.setParameter("color", Vector3(0.2f, 0.8f, 1.0f));
ΠΡΠΎΡΠΈΠ»ΠΈ ΠΏΠΎΡΡΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ
Wudgine ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΠΈ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ°ΡΡ ΠΏΡΠΎΡΠΈΠ»ΠΈ ΠΏΠΎΡΡΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ Π΄Π»Ρ ΡΠ°Π·Π½ΡΡ ΡΠΈΡΡΠ°ΡΠΈΠΉ:
// Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΡΠΎΡΠΈΠ»Π΅ΠΉ ΠΏΠΎΡΡΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ
auto& postProcess = renderer.getPostProcessStack();
// ΠΡΠΎΡΠΈΠ»Ρ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ
auto defaultProfile = postProcess.createProfile("Default");
defaultProfile->addEffect<BloomEffect>().setIntensity(0.3f);
defaultProfile->addEffect<TonemappingEffect>().setOperator(TonemappingOperator::ACES);
// ΠΡΠΎΡΠΈΠ»Ρ Π΄Π»Ρ ΠΏΠΎΠ΄Π²ΠΎΠ΄Π½ΡΡ
ΡΡΠ΅Π½
auto underwaterProfile = postProcess.createProfile("Underwater");
underwaterProfile->addEffect<BloomEffect>().setIntensity(0.2f);
underwaterProfile->addEffect<ColorGradingEffect>().setLUT("assets/textures/luts/underwater.png");
underwaterProfile->addEffect<DistortionEffect>().setIntensity(0.05f);
underwaterProfile->addEffect<VignetteEffect>().setIntensity(0.4f);
// ΠΡΠΎΡΠΈΠ»Ρ Π΄Π»Ρ Π½ΠΎΡΠ½ΠΎΠ³ΠΎ Π²ΠΈΠ΄Π΅Π½ΠΈΡ
auto nightVisionProfile = postProcess.createProfile("NightVision");
nightVisionProfile->addEffect<ColorGradingEffect>().setGain(Vector3(0.0f, 1.2f, 0.0f));
nightVisionProfile->addEffect<NoiseEffect>().setIntensity(0.1f);
nightVisionProfile->addEffect<VignetteEffect>().setIntensity(0.7f);
// ΠΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠΎΡΠΈΠ»Π΅ΠΉ
postProcess.setActiveProfile("Default");
// ΠΠΎΠ·ΠΆΠ΅ Π² ΠΈΠ³ΡΠ΅
postProcess.setActiveProfile("Underwater");
// ΠΠ»Π°Π²Π½ΡΠΉ ΠΏΠ΅ΡΠ΅Ρ
ΠΎΠ΄ ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΡΠΎΡΠΈΠ»ΡΠΌΠΈ
postProcess.blendToProfile("NightVision", 2.0f); // ΠΠ΅ΡΠ΅Ρ
ΠΎΠ΄ Π·Π° 2 ΡΠ΅ΠΊΡΠ½Π΄Ρ
Π‘Π»Π΅Π΄ΡΡΡΠΈΠ΅ ΡΠ°Π³ΠΈ
Π’Π΅ΠΏΠ΅ΡΡ, ΠΊΠΎΠ³Π΄Π° Π²Ρ ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΠ»ΠΈΡΡ Ρ ΡΠΈΡΡΠ΅ΠΌΠΎΠΉ ΠΏΠΎΡΡΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ Wudgine, ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΠΌ: