Status
SteamPeaks
ChartsSalesUpcomingPatchesNewsCalculator
New on SteamEvery app, DLC and depot the minute Steam creates itAppsEvery app on Steam, newest change firstPackagesSubs and bundles, and what each containsDepotsDepots, manifests and install sizesTagsSteam's user tags and the games under themDevelopers & publishersCompanies and their cataloguesTechnologiesEngines, SDKs and anti-cheat found in the filesChange historyEvery PICS changelist as it lands
SignalsNineteen readings of the whole catalogueCompareAny games side by sideRecordsAll-time peaks and the days they were setReportsWeekly and monthly write-upsAlerts & newsroomWatch a game, get told when it movesSteam statusIs Steam up, right nowWeb API explorerTry the endpoints in the browser
NewsSteam's own announcements and the sales calendarCalculatorWhat a Steam account is worth, and its pile of shame
/
Sign in
/
SteamPeaks
The ultimate resource for Steam data.
ExploreChartsSalesSales and festsUpcomingPatchesNewsRecordsTrendingSignals
DatabaseAppsPackagesDepotsTagsDevelopersTechnologiesChange history
ToolsCalculatorCompareSearchAlertsSteam statusAPI
SiteMethodologyFAQDiscordSupportSign in via Steam
Not affiliated with Valve or Steam. Game names and artwork belong to their owners. All times UTC.
PrivacyCookiesFair useStatus
sfsimNewsDeferred Rendering
Major update

Deferred Rendering

sfsim · published 27 Aug 2026, 20:23 UTC

All newsPlayers around this dateRead on Steam

I have released version 0.30-1 of sfsim.

This release introduces a major overhaul of the rendering code as well as a runway for the spacecraft. The rendering system is implemented using the Clojure programming language as well as GLSL. LWJGL3 is used to access the graphics card’s OpenGL bindings.

The new rendering code uses deferred shading, which first computes and stores per-pixel geometry data in a geometry buffer (G-buffer), then calculates each pixel’s final lighting in a separate shader pass. Deferred shading makes it easy to render decals, which are essentially textures projected onto scene geometry. It also enables efficient real-time rendering of many localized light sources.

Deferred rendering splits rendering into stages so geometry is processed first, lighting later.

Step by step from the images:

Geometry Pass

Projecting Geometry

The scene is made of triangles. A vertex shader is used to project the triangles which are passed to the rasterizer. For the planet mesh, the geometry is further refined through tessellation and geometry shaders. The geometry pass draws all visible geometry and stores per-pixel surface data into multiple buffers (textures) as shown below instead of computing final lighting immediately.

Although the runway could be rendered as a decal in a separate pass, it was chosen to render it within the same shader as the planet. This will make it easier to later adopt runtime virtual texturing, for example to render airport ground surfaces with markings.

Diffuse buffer

The diffuse buffer stores the base RGB color of the material at each pixel. There is also an emissive buffer for light-emitting surfaces which is not shown here.

Material property buffer

The metallic buffer stores a scalar indicating how reflective the material at each pixel is. The buffer with specular strength (inverse roughness) is not shown here.

Normal buffer

The normal buffer stores the surface normal vector at each pixel in the camera coordinate system. Normals are useful lateron in order to determine the incident angle of incoming light.

View-space Position buffer

The view-space position buffer stores the 3D position of the surface visible at each pixel. This data is useful for computing atmospheric scattering and the distance to local light sources during the subsequent lighting pass.

Lighting pass

During the lighting pass, the G-buffer and a shadow map are used to calculate per-pixel lighting. Blending can also be used in this pass to update the lighting of only part of the scene, without evaluating every light source at every pixel. This image shows the shaded result produced with a Phong model.

Atmospheric effects

Phong shading computes the surface color after lighting. The lighting shader also accounts for atmospheric scattering. Atmospheric scattering both adds in-scattered light and removes part of the incoming light through scattering.

Final compositing

The volumetric clouds are rendered separately using a lower resolution. The lighting pass then incorporates the cloud layer using depth-aware upsampling.


Let me know any feedback and comments in the sfsim playtest discussion forum.

Don’t forget to wishlist sfsim!

More from sfsim

Other announcements

All news
Community6 Sep 2026ShockwavesI am excited to share early results of shockwave rendering with the community! I would like to add visualization of a glowing shockwave during atmospheric reentry in the sfsim spaceflight simulator. I explored possible approaches by discussing the problem with Google Gemini. Popular approaches seem to use meshes with animated semi-transparent noise textures. However this still leaves the proble…Game update7 Aug 2026Metallic and roughness factorI have released version 0.29-1 of sfsim . The Open Asset Import Library (assimp) which is shipped with the LWJGL3 library has been updated some time ago. I am now able to access the metallic value and the roughness value from the glTF exported by Blender . The metallic and roughness value are now used in the model shader programs so that the spacecraft has a more metallic surface. In the meanti…In-game event16 Jul 2026Deferred shadingCurrently I am working on deferred shading. This requires me to separate rendering into two passes: · Geometry pass : render data to a point buffer, normal buffer, and a color buffer, etc. · Lighting pass : use the geometry buffers to compute lighting including shadows and volumetric clouds. The change is quite a bit of work, because I have to split up the graphics code and the shaders for rend…