That effect is often referred to as “film grain”. It is a post processing effect usually. And/or handled by shaders. And I do not believe gdevelop has anyway to it or even current extensions.
However this forum post has someone who has create a custom extension that adds a bunch of post processing stuff
Here is the github
master ← Carrotstudio0:joints
opened 10:45AM - 02 Mar 26 UTC
<html>
<body>
<html><head></head><body><h2>Summary</h2>
<p>This PR adds sever… al new native systems to GDevelop's 3D engine. The core additions are fully integrated and production-ready. The Physics3D joints/ragdoll system is also included but can be dropped from this PR if the team prefers to keep the scope focused — the lighting and shader systems are the more complete and tested part of this work.</p>
<hr>
<h2>What Was Added</h2>
<h3>New Effects Overview</h3>
System | Effect | Registered As | Status
-- | -- | -- | --
Post-Processing | Chromatic Aberration | Scene3D::ChromaticAberration | Ready
Post-Processing | Color Grading | Scene3D::ColorGrading | Ready
Post-Processing | Tone Mapping | Scene3D::ToneMapping | Ready
Post-Processing | Screen-Space Reflections | Scene3D::ScreenSpaceReflections (SSR) | Ready
Post-Processing | Depth of Field | Scene3D::DepthOfField (DOF) | Ready
Post-Processing | Volumetric Fog | Scene3D::VolumetricFog (FOG) | Ready
Post-Processing | SSAO | Scene3D::SSAO | Ready
Lighting | Rim Light | Scene3D::RimLight | Ready
Lighting | Flickering Light behavior | Scene3D::FlickeringLight | Ready
Lighting | CSM Shadows + Stabilization | DirectionalLight upgrade | Ready
Lighting | Light Bounce (physics-aware) | PointLight / SpotLight | Ready
Physics3D | PulleyJoint | Physics3D::PulleyJoint | Included — droppable
Physics3D | Advanced Joint Controls | Motors / Springs / Break thresholds | Included — droppable
Physics3D | Ragdoll System + Humanoid builder | Jolt behavior extension | Included — droppable
<blockquote>
<p><strong>Note:</strong> If the joints/ragdoll system is not yet practical to merge, it can be excluded from this PR entirely. The lighting and shader effects are self-contained and have no dependency on the Physics3D additions.</p>
</blockquote>
<hr>
<h2>Shader Architecture (SSAO, SSR, DOF, Volumetric Fog and more )</h2>
<p>All four screen-space effects share the same consistent pattern:</p>
<p><strong>Structure of each shader:</strong></p>
<ul>
<li>An independent <code>ShaderPass</code> per effect — no coupling between passes.</li>
<li>A minimal vertex shader (fullscreen pass-through) that forwards UV coordinates.</li>
<li>A fragment shader that reads:
<ul>
<li><code>tDiffuse</code> — current rendered scene color</li>
<li><code>tDepth</code> — scene depth buffer</li>
<li><code>resolution</code> + camera matrices (primarily <code>projectionMatrixInverse</code>)</li>
</ul>
</li>
<li>All computation is fully screen-space. No geometry, materials, or object data is modified.</li>
</ul>
<p><strong>How they are registered in the engine:</strong></p>
<ol>
<li>Each effect is registered via <code>gdjs.PixiFiltersTools.registerFilterCreator('Scene3D::...')</code>.</li>
<li>Declared in <code>JsExtension</code> as official effects with user-configurable properties.</li>
<li>On enable: <code>addPostProcessingPass(shaderPass)</code>.</li>
<li>On disable: <code>removePostProcessingPass(shaderPass)</code>.</li>
<li>Each frame: <code>updatePreRender</code> updates all uniforms.</li>
</ol>
<hr>
<h2>Why There Are No Conflicts Between Effects</h2>
<p>The pipeline is designed so all effects can be active simultaneously without interference:</p>
<ol>
<li><code>PostProcessingSharedResources</code> provides a single unified color + depth capture per layer, rather than each effect rendering independently. This is the key reason stacking multiple effects is safe.</li>
<li>State is stored using <code>WeakMap</code> keyed by renderer, so each layer's state is fully isolated.</li>
<li>Pass order is fixed and managed: <code>SSAO -> RIM -> DOF -> SSR -> FOG -> BLOOM</code> — no ordering conflicts and no unexpected compositing results.</li>
<li>Each pass has a unique ID. Re-ordering operates only on managed passes, not the full pipeline.</li>
<li>Each effect owns its own state and uniforms. No mutable state is shared directly between effects.</li>
</ol>
<hr>
<h2>Why There Are No Conflicts With Existing Engine Systems</h2>
<ol>
<li>All shader work runs after the scene render as a post-process — physics, gameplay, collisions, and behaviors are completely untouched.</li>
<li>Effects only read from the scene (depth buffer, color buffer, light data). They do not write to or modify any object, behavior, or runtime state.</li>
<li>Safety guards are in place:
<ul>
<li>If THREE is not available, an <code>EmptyFilter</code> is returned instead of throwing.</li>
<li>If the target is not a valid Layer or the stack is locked, the pass disables safely.</li>
</ul>
</li>
<li>All configurable values (<code>radius</code>, <code>samples</code>, <code>intensity</code>, etc.) are clamped to valid ranges to prevent unstable or undefined shader behavior.</li>
</ol>
<hr>
<h2>Lighting Changes</h2>
<h3>DirectionalLight — CSM + Stabilization</h3>
<p>The existing <code>Scene3D::DirectionalLight</code> was upgraded with:</p>
<ul>
<li>3 shadow cascades replacing the single shadow map, with <code>cascadeSplitLambda</code> controlling split distribution.</li>
<li>Per-cascade quality levels (near = high detail, far = soft shadows).</li>
<li>Shadow stabilization via texel-grid snapping in light-space — eliminates shadow swimming during camera movement.</li>
<li>Two anchor modes: <code>shadowFollowCamera</code> true/false.</li>
<li>Shadow map size updated to support up to <code>4096</code> on high-end GPUs.</li>
</ul>
<p>New parameters: <code>maxShadowDistance</code>, <code>cascadeSplitLambda</code>, <code>shadowMapSize</code>, <code>shadowFollowLead</code>, <code>shadowFollowCamera</code>.</p>
<h3>SpotLight & PointLight</h3>
<ul>
<li>Both lights now accept an origin object (position follows the object) and a target object (direction auto-aims at target every frame).</li>
<li>Added a light bounce system: PointLight and SpotLight detect physics-enabled objects within range and calculate reflected light contribution based on surface normals and material properties.</li>
</ul>
<h3>Flickering Light Behavior</h3>
<p>New behavior attachable to PointLight or SpotLight. Parameters: <code>baseIntensity</code>, <code>flickerSpeed</code>, <code>flickerStrength</code>, <code>failChance</code>, <code>offDuration</code>. Uses a sine + noise signal, writing intensity via <code>updateDoubleParameter</code>.</p>
<h3>Rim Light</h3>
<p>New <code>Scene3D::RimLight</code> effect for cinematic character separation. Controllable color, intensity, and falloff.</p>
<hr>
<h2>Physics3D (Jolt) — Optional / Droppable</h2>
<p>As noted above, this can be excluded if not ready to review. Included:</p>
<ul>
<li><code>Physics3D::PulleyJoint</code> — rope-over-pulley constraint with <code>ratio</code> and <code>totalLength</code>.</li>
<li>Advanced joint controls: Motors, Limits, Springs, Friction, Solver overrides, Break thresholds (<code>SetJointBreakThresholds</code> / <code>ClearJointBreakThresholds</code>), Reaction force/torque monitoring.</li>
<li>Full Ragdoll system with states (<code>Active</code>, <code>Limp</code>, <code>Stiff</code>, <code>Frozen</code>), group controls, humanoid templates (<code>BuildHumanoidRagdoll</code>, <code>BuildHumanoidRagdollFromTag</code>), and a built-in GUI.</li>
</ul>
<hr>
<h2>Files Modified / Added</h2>
<ul>
<li><code>Extensions/3D/ChromaticAberrationEffect.ts</code></li>
<li><code>Extensions/3D/ColorGradingEffect.ts</code></li>
<li><code>Extensions/3D/ToneMappingEffect.ts</code></li>
<li><code>Extensions/3D/ScreenSpaceReflectionsEffect.ts</code></li>
<li><code>Extensions/3D/DepthOfFieldEffect.ts</code></li>
<li><code>Extensions/3D/VolumetricFogEffect.ts</code></li>
<li><code>Extensions/3D/SSAOEffect.ts</code></li>
<li><code>Extensions/3D/RimLightEffect.ts</code></li>
<li><code>Extensions/3D/FlickeringLightBehavior.ts</code></li>
<li><code>Extensions/3D/DirectionalLight.ts</code> (modified — CSM upgrade)</li>
<li><code>Extensions/3D/JsExtension.js</code> (modified — effect registrations)</li>
<li><code>Extensions/Physics3DBehavior/Physics3DRuntimeBehavior.ts</code> (modified)</li>
<li><code>Extensions/Physics3DBehavior/JsExtension.js</code> (modified)</li>
</ul></body></html>
</body>
</html>
<img width="553" height="819" alt="Screenshot 2026-03-02 021647" src="https://github.com/user-attachments/assets/9586717b-7afa-4fe2-a53b-3e01a89ab860" />
<img width="1593" height="903" alt="Screenshot 2026-03-02 024923" src="https://github.com/user-attachments/assets/57fab8c4-1506-4fd6-b4dd-fd4b57c3eb2e" />
<img width="1602" height="906" alt="Screenshot 2026-03-02 025024" src="https://github.com/user-attachments/assets/4fb1c410-8a95-4046-aacc-d44e4bb2e1b9" />
<img width="1617" height="905" alt="Screenshot 2026-03-02 025044" src="https://github.com/user-attachments/assets/78e648f6-290a-4365-b39e-f0c698bf3956" />
<img width="1590" height="872" alt="Screenshot 2026-03-02 025105" src="https://github.com/user-attachments/assets/92faa1fc-de3f-4b48-b54e-19b603fc1d2d" />
<img width="1602" height="894" alt="Screenshot 2026-03-02 025133" src="https://github.com/user-attachments/assets/d0a1b670-cced-473e-9d27-a0f6c40bf21c" />
<img width="1632" height="879" alt="Screenshot 2026-03-02 015649" src="https://github.com/user-attachments/assets/7de67dbd-a8fc-457b-a793-7afe24cbc44a" />
<img width="1574" height="885" alt="Screenshot 2026-03-02 020226" src="https://github.com/user-attachments/assets/e4f19402-dd1d-408f-b234-585e4d91364b" />
<img width="1913" height="927" alt="Screenshot 2026-03-01 183546" src="https://github.com/user-attachments/assets/59ed4320-9399-4e72-a37e-672508887dd1" />
<img width="1880" height="892" alt="Screenshot 2026-03-01 194649" src="https://github.com/user-attachments/assets/ac0234f4-bfc2-4640-a7b6-e1eb27cf7379" />
<img width="1632" height="897" alt="Screenshot 2026-03-01 191350" src="https://github.com/user-attachments/assets/8c88e948-ea49-43f9-b5ed-541608a3fc65" />
<img width="1919" height="955" alt="Screenshot 2026-03-01 030835" src="https://github.com/user-attachments/assets/7a7dd675-362f-40f4-97b0-09b123c5de6a" />
The only way I can I think of doing it Gdevelop right now with no code and no custom extensions or anything is adding a Seamless Texture that tiles over your entire scene. Then you will need to animate it. Then you can use gdevelop logic to format it and size it your screen , animate it and call it every frame
Here is my javascript code I usually start with for mouse/camera controls. It is setup to be 3rd person not 1st person but you can tweak the settings to get whatever camnera view you want.
const player = runtimeScene.getObjects("Player3dModel")\[0\];
if (!player) return;
const camera = player.getBehavior("ThirdPersonCamera");
if (!camera) return;
const vars = runtimeScene.getVariables();
// Always initialize once.
if (!vars.has("CamInit")) {
vars.get("CamInit").setBoolean(true);
vars.get("CamRot").setNumber(0);
vars.get("CamElev").setNumber(20);
vars.get("TargetDist").setNumber(500);
vars.get("CurrentDist").setNumber(500);
vars.get("PrevMouseX").setNumber(0);
vars.get("PrevMouseY").setNumber(0);
vars.get("Dragging").setBoolean(false);
vars.get("RotationSensitivity").setNumber(0.09);
vars.get("ElevationSensitivity").setNumber(0.25);
}
// One shared gate for all gameplay mouse control.
const uiOwnsMouse =
vars.get("ControlsMenuOpen").getAsBoolean() ||
vars.get("WaitingForKey").getAsString() !== "";
if (uiOwnsMouse) {
vars.get("Dragging").setBoolean(false);
return;
}
const input = runtimeScene.getGame().getInputManager();
const mouseX = input.getMouseX();
const mouseY = input.getMouseY();
const leftPressed =
gdjs.evtTools.input.isMouseButtonPressed(
runtimeScene,
"Left"
);
if (leftPressed) {
if (!vars.get("Dragging").getAsBoolean()) {
vars.get("Dragging").setBoolean(true);
vars.get("PrevMouseX").setNumber(mouseX);
vars.get("PrevMouseY").setNumber(mouseY);
} else {
const dx =
mouseX - vars.get("PrevMouseX").getAsNumber();
const dy =
mouseY - vars.get("PrevMouseY").getAsNumber();
let rot = vars.get("CamRot").getAsNumber();
let elev = vars.get("CamElev").getAsNumber();
rot += dx \* vars.get("RotationSensitivity").getAsNumber();
elev -= dy \* vars.get("ElevationSensitivity").getAsNumber();
if (elev > 80) elev = 80;
if (elev < 0) elev = 0;
vars.get("CamRot").setNumber(rot);
vars.get("CamElev").setNumber(elev);
camera.SetRotationAngleOffset(rot);
camera.SetElevationAngleOffset(elev);
vars.get("PrevMouseX").setNumber(mouseX);
vars.get("PrevMouseY").setNumber(mouseY);
}
} else {
vars.get("Dragging").setBoolean(false);
}
const wheel =
gdjs.evtTools.input.getMouseWheelDelta(runtimeScene);
if (wheel !== 0) {
let target = vars.get("TargetDist").getAsNumber();
target -= wheel \* 1;
if (target < 100) target = 100;
if (target > 1500) target = 1500;
vars.get("TargetDist").setNumber(target);
}
let current = vars.get("CurrentDist").getAsNumber();
const target = vars.get("TargetDist").getAsNumber();
current += (target - current) \* 0.20;
vars.get("CurrentDist").setNumber(current);
camera.SetDistance(current);