// transmission.log

Data Feed

> Intercepted signals from across the network — tech, engineering, and dispatches from the void.

1689 transmissions indexed — page 6 of 85

[ 2026 ]

20 entries
109|blog.unity.com

Making fire feel alive: Real-time fluid simulation in Ignitement

In today’s guest post, solo dev Sørb breaks down the technical artistry behind the impressive fire and lava VFX in his upcoming action roguelite, Ignitement.The first thing you notice when looking at Ignitement is the VFX. There’s something immediately different about them, especially the fire. It doesn’t just look animated, it feels alive, reactive, and deeply integrated into the world.So what’s going on under the hood?Why you should care about fire VFXFire, and fluid-like effects in general, are notoriously difficult to get right in games. Traditional particle systems can look great, but they often lack true interaction with the world. On the other end of the spectrum, full 3D simulations are usually far too expensive for real-time gameplay.A few games have explored fluid simulation as a core mechanic. In Little Inferno by the Tomorrow Corporation (above), fire behavior is central to the experience, while Steve Mason’s Plasma Pong (below) builds its entire gameplay around reactive, flowing motion. These examples highlight how powerful fluid-based systems can be when they directly influence gameplay.The core ideaInstead of relying on particle systems, Ignitement uses a fully dynamic, real-time fluid simulation.At first glance, this might sound expensive.“But doesn’t that just set your PC on fire and tank performance?”At least not the hardware.The simulation is entirely 2D and runs through Graphics.Blit, updating a small set of textures (primarily 1024×1024 and 512×512). In practice, this makes it comparable in cost to a few post-processing effects.Another deliberate choice was to stick with fragment shaders instead of compute shaders. This lets the system take advantage of built-in texture filtering and interpolation, while also keeping compatibility high, even on older hardware or potential console targets.To make things easier to follow, we can break the system into three parts:SimulationRenderingLightingFluid simulation breakdownAt its core, the system is a standard fluid simulation implemented entirely via Graphics.Blit passes. The simulation operates on several textures, each representing a different physical property:Density (1024×1024, RGBA half) This is your smoke, everything that makes the air feel thick and visible.Velocity (512×512, RG half) This controls how things move. If something flows, drifts, or swirls, this is why.Temperature (1024×1024, single-channel half) Determines how hot different regions are.Reaction (1024×1024, RGBA half) This is where the actual fire lives, its intensity, spread, and behavior.Keeping this structure in mind, the fluid solver can be outlined with this pseudo-code:The reaction data even escapes the GPU from time to time. It’s downsampled and read back on the CPU to drive gameplay effects like damage. So yes, the fire doesn’t just look dangerous, it actually is!The simulation domain itself isn’t fixed in the world. Instead, it follows the camera and shifts as the player moves. This creates the illusion of an endless, continuous simulation, even though only a relatively small region is actually being computed at any given time. Smoke everywhere, cost nowhere.RenderingOnce all that data is in place, the next step is making it look like something you’d actually want to stare at.FireFire is rendered from the reaction texture, which is treated a bit like a heightmap. A parallax-style trick in the fragment shader gives it a pseudo-3D look, adding depth without the cost of true volumetrics.SmokeSmoke and fog come mostly from the temperature information. These are interpreted in the shader to produce soft, evolving shapes that feel surprisingly volumetric for something that’s technically just a couple of textures being pushed around.EmbersAnd of course, no fire is complete without embers.These are GPU-driven particles that sample the velocity field, meaning they naturally follow the flow of the simulation. No extra logic needed, they just go with the flow (literally).These ember particles are updated and advected using a custom GPU implementation (no Shuriken, no VFX Graph). So just a ComputeBuffer for all the particle data, a ComputeShader.Dispatch call to update them, and a Graphics.DrawProcedural call to render them to the screen.LightingCalculating the light mapLighting is handled using a simple trick that ends up doing a lot of heavy lifting.The reaction texture is downsampled and blurred, turning it into a dynamic light map. It’s not physically accurate, but it doesn’t need to be. It just needs to look right!Applying lighting to the environmentWhen rendering objects, lighting comes down to a single texture lookup in a custom shader.Instead of sampling directly at the surface, the lookup is nudged slightly along the surface normal: worldPosition + worldNormal * cThis tiny offset goes a long way. It creates the impression that light is coming from the environment, giving surfaces a convincing sense of depth and directionality.All of that, from one texture sample. Not bad.If you want to know the details, here is the shader-function I use:I just put this function and all needed uniform variables in a .cginc file and conveniently use it in any shader that wants to read from the light map.Extending the light map beyond lightingOne of the nicest side effects of this setup is that the light map isn’t just for lighting.In Ignitement, parts of the UI actually use it as well. Elements with normal maps sample the light map to fake reflections. For example, the glass of the health container picks up the surrounding fire, making it feel connected to the world instead of just sitting on top of it.This also opens the door for more unusual effects.In one area, the environment is made up of “flesh walls” (because why not?). These use the light map to control how strongly they wiggle. The more intense the nearby fire, the more the walls react, giving the impression that the environment itself is alive and not particularly happy about being on fire.Even better, this is all done in the vertex shader, making it extremely cheap for something that looks this dynamic.How do fire VFX affect gameplay?Visuals are nice, but a good VFX system alone doesn’t make a good game. In Ignitement, fire directly affects gameplay: any enemy touching it receives a burning debuff that deals damage over time.To make this work, the simulation data has to be available on the CPU. Each frame, the reaction texture is downsampled and read back using AsyncGPUReadback.RequestIntoNativeArray. Instead of doing expensive per-object queries on the GPU, the system reads the texture once and performs cheap lookups on the CPU for every enemy. Using a simple threshold, this effectively behaves like a single, highly dynamic collider that perfectly matches the shape of the fire at any given moment.Limitations and trade-offsOf course, this approach isn’t perfect.Because the simulation is 2D, anything happening vertically is more of an approximation than a physically correct solution. Also, shifting the simulation domain requires a bit of care to avoid visible seams or popping.That said, these trade-offs are very intentional. They keep the system fast, scalable, and widely compatible, while still delivering results that feel rich and reactive.Key takeaways2D fluid simulations can go a lot further than you might expectReusing simulation data is where a lot of the magic happens“Looks right” often beats “is physically correct”GPU-to-CPU readback is perfectly viable when kept smallOne well-designed system can drive visuals, gameplay, and UI all at onceBy building everything on top of a shared fluid simulation, Ignitement ends up with a cohesive visual style where fire, lighting, UI, and even parts of the environment all speak the same language.The result isn’t just better visuals, it’s a world that feels more connected, more reactive, and more alive.And all of that starts with a few textures, a couple of shaders… and setting everything on fire.If you like fluid simulation and survivor-likes / roguelikes feel free to wishlist Ignitement on Steam and join the Discord. Explore more Made with Unity games on our Steam Curator page, and check out more stories from Unity developers on the Unity Blog and Resource Hub.

>access_file_
118|godotengine.org

Dev snapshot: Godot 4.7 dev 5

As is tradition at this point: feature freeze arrived, and so too did countless last-minute pull requests from contributors. So despite the previous development snapshot releasing just one week ago, there’s no shortage of brand-new goodies ready to be experienced firsthand! Please consider supporting the project financially, if you are able. Godot is maintained by the efforts of volunteers and a small team of paid contributors. Your donations go towards sponsoring their work and ensuring they can dedicate their undivided attention to the needs of the project. Jump to the Downloads section, and give it a spin right now, or continue reading to learn more about improvements in this release. You can also try the Web editor, the XR editor, or the Android editor for this release. If you are interested in the latter, please request to join our testing group to get access to pre-release builds. The cover illustration is from Lost Wiki: Kozlovka, a detective game where you explore a Wikipedia-esque database to solve a small-town mystery in 90s Eastern Europe. You can buy the game on Steam, and follow the developer on Bluesky, YouTube, or itch.io. Highlights Assetlib: Port asset store to new API Did you know we have an overhaul to our asset store in the works? Well… Now you do! Michael Alexsander has been hard at work bringing our current system into this new paradigm, culminating in GH-112992 fully supporting the new API. While we hope to showcase details on this new system in the future, for now we’ll simply highlight the more obvious improvements that this PR delivers. Starting with the main selection screen, the way we display our asset items has been polished. Not only will it be easier to parse the asset items themselves, but more metadata and the current rating will be readily visible. When accessing an asset in isolation, you’ll have immediate access to the current description and all existing changelogs. What’s more, the ability to change an asset’s version is now just one click away. Editor: Rework export template dialog to allow individual templates A long-standing pain point for anyone that’s worked with export templates has been that they must be downloaded in bulk. This was in contrast to how our editor downloads were always isolated, causing the export templates to incur long download times for a range of platforms that aren’t necessarily relevant to a developer’s intended export targets. This could be solved in two main ways: overhauling our existing distribution system to make the packages available in isolation, or somehow repurposing the existing bulk distribution to only distribute a subset of options. Despite how absurd it sounded, Tomasz Chabora managed to implement the latter! GH-117072 managed the seemingly-impossible task of hijacking the bulk package and retrieving slices of the developer’s choosing. This is all achieved within the Godot editor itself, making the process as seamless and expedient as possible for users. GUI: Enable scaling images relative to font size in RichTextLabel Malcolm Anderson brings new life to [img] tags in RichTextLabel with GH-112617. Now width and height can specify em for their scaling. This would result in the following text… Do you have any [img height=1em]coin.png[/img] coins? ...I said, [font_size=50]DO YOU HAVE ANY [img height=1em]coin.png[/img] COINS??[/font_size] …displaying like this: Shaders: Implement inline text shader previews A long-awaited quality-of-life addition to the text shader editor comes courtesy of Yuri Rubinsky, with his PR GH-117726 bringing inline previews. This is a C++ implementation of Godot Shader Previewer, a popular addon written in GDScript by Cashew OldDew. Much like the addon before it, this aims to reduce the amount of guesswork when constucting text shaders, as now one can readily see the resulting effects within the text editor itself: Rendering: Add rectangular area light source Rendering has received a lot of love in these snapshots, and we’re ending things off strong with Emil Dobetsberger’s work in GH-108219 delivering rectangular area light sources. By leveraging the new AreaLight3D, it’s now possible to render real-time light from a rectangle in 3D space. And more! There are too many exciting changes to list them all here, but here’s a curated selection: 3D: Add vertex snap support for subgizmo points (GH-117922). Audio: Revamp audio bus UI (GH-118266). Editor: Allow moving and resizing the embedded game window on Android (GH-118417). Editor: Improve Remote/Local SceneTreeDock buttons’ appearance (GH-118192). Export: Android: Add export options to customize splash screen (GH-114671). GDExtension: Add Variant::get_type_by_name to GDExtension Interface (GH-117160). Input: Wayland: Implement touch support (GH-113886). Platforms: Change embedded window options to use three stacked dots and add HDR info (GH-118079). Rendering: Refactor raytracing pipelines (GH-118044). Changelog 71 contributors submitted 135 fixes for this release. See our interactive changelog for the complete list of changes since 4.7-dev4. You can also review all changes included in 4.7 compared to the previous 4.6 feature release. This release is built from commit a8643700c. Downloads { const thankYouWrapper = document.getElementById('thank-you'); // Close itself, when clicked outside of the popup area. thankYouWrapper.addEventListener('click', (e) => { if (e.target === thankYouWrapper) { thankYouWrapper.style.display = 'none'; } }); // Close with a close button. const thankYouBackButton = document.querySelector('.btn-close-thankyou-popup'); thankYouBackButton.addEventListener('click', () => { thankYouWrapper.style.display = 'none'; }); // Open from the main download buttons. const downloadButtons = document.querySelectorAll('.btn-download, .download-button'); downloadButtons.forEach((it) => { if (it.dataset?.external === "yes") { return; } it.addEventListener('click', () => { thankYouWrapper.style.display = ''; document.querySelector('.btn.btn-donate').focus(); }); }); // Open from the all downloads list. const downloadLinks = document.querySelectorAll('.download-link'); downloadLinks.forEach((it) => { it.addEventListener('click', () => { thankYouWrapper.style.display = ''; }); }); // Close the dialog when the user presses the escape key. document.addEventListener('keydown', (e) => { if (e.key === 'Escape') { thankYouWrapper.style.display = 'none'; } }); }); Godot is downloading... Standard build includes support for GDScript and GDExtension. .NET build (marked as mono) includes support for C#, as well as GDScript and GDExtension. a pre-release piece of software. Be sure to make frequent backups, or use a version control system such as Git, to preserve your projects in case of corruption or data loss. Known issues With every release we accept that there are going to be various issues, which have already been reported but haven’t been fixed yet. See the GitHub issue tracker for a complete list of known bugs. There are currently no known issues introduced by this release. Bug reports As a tester, we encourage you to open bug reports if you experience issues with this release. Please check the existing issues on GitHub first, using the search function with relevant keywords, to ensure that the bug you experience is not already known. In particular, any change that would cause a regression in your projects is very important to report (e.g. if something that worked fine in previous 4.x releases, but no longer works in this snapshot). Support Godot is a non-profit, open-source game engine developed by hundreds of contributors in their free time, as well as a handful of part and full-time developers hired thanks to generous donations from the Godot community. A big thank you to everyone who has contributed their time or their financial support to the project! If you’d like to support the project financially and help us secure our future hires, you can do so using the Godot Development Fund platform managed by the Godot Foundation. There are also several alternative ways to donate which you may find more suitable. Donate now

>access_file_