Sign in

Karl

@hexaquo.at
1.4K followers 970 following 213 posts

Researcher, teacher and activist somewhere at the intersection of landscape perception, graphics programming, open source, and climate change. Working on VR landscape visualization with Godot. Maintaining Geodot: github.com/boku-ilen/geodot-plugin

PostsRepliesMedia
Reposted by Karl
Adriaan @adriaan.games · 16/09/2026
We optimized draw calls by 99% (lol) in Hidden Folks 2 by writing some tools to find all textures used in a level, generate a level-specific atlas, and replace individual texture references with atlas textures. Thread below 🧵👇🏼 #godotengine
Two side-by-side screenshots showing before and after we applied a texture atlas optimization to our game Hidden Folks two, the before showing 13318 draw calls and the after showing 113 draw calls
1351578
Reposted by Karl
Ryan Moulton @moultano.bsky.social · 19/06/2026
I spent the last month obsessed with finding colors that can't be displayed on a conventional screen. This is what I found. moultano.wordpress.com/2026/06/19/w...
moultano.wordpress.com
Where to Find the Colors Your Screen Can’t Show You
An atlas of the vibrance of the real world
471129380
Reposted by Karl
Antonio Caggiano @antoniocaggiano.eu · 12/06/2026
For anyone who couldn't make it to GodotCon, the recording of my talk "Integrating Vulkan Ray Tracing in Godot" is now up on YouTube! #Godot #Vulkan #RayTracing
youtube.com
Integrating Vulkan Ray Tracing in Godot – Antonio Caggiano – GodotCon 2026
YouTube video by Godot Engine
4518
Reposted by Karl
nicebyte @nicebyte.bsky.social · 12/04/2026
INTRODUCTION TO SPHERICAL HARMONICS FOR GRAPHICS PROGRAMMERS finally done. gpfault.net/posts/sph.html
gpfault.net
Introduction to Spherical Harmonics for Graphics Programmers
1027886
Karl @hexaquo.at · 13/04/2026
Right, it's one of the typical inputs of PBR materials. The RGB values in normal maps represent the XYZ components of 3D vectors for adding extra detail during the shading step. The vector/color (0.5, 0.5, 1.0) represents "flat", which is why these maps usually have a somewhat purple appearance.
020
Karl @hexaquo.at · 13/04/2026
I haven't noticed any problems with zero alpha pixels, what exactly are you running into? I did notice that our normal maps are often very transparent for some reason, but alpha is ultimately ignored there anyways. Unfortunately not, I already had two work appointments on those exact dates :(
100
Karl @hexaquo.at · 12/04/2026
Did you know you can set up a scene and render it to a texture without any nodes in #Godot, by directly using the RenderingServer? We automatically generate billboard sprites for meshes this way. There's not much info about the RenderingServer online, so I wrote about it: hexaquo.at/pages/using-...
a 3D tree asset on the left, with an arrow pointing to spritesheets on the right. The spritesheets contain 2 albedo sprites (front and side) and 2 normal sprites (also front and side).
324343
Reposted by Karl
Victoria Rose Richards @aerialembroidery.bsky.social · 09/04/2026
'A simple (perfect) life' - my spring landscape is finally finished! An apple orchard in bloom, old railway, sheep with their lambs and an allotment being prepared for growing :) Zoom in to see all the other tiny details too... I think this might be my favourite aerial embroidery I've ever done!
An embroidery hoop containing a sewn aerial view landscape. It depicts an apple orchard in bloom in the centre, allotments to the left and sheep in their field at the bottom. Train tracks go past the top of the orchard and allotment.Sewn train tracks past an apple orchard (to the left).An angled view of a sewn vegetable allotment surrounded by rough land, trees and with train tracks to the left.An angled view of embroidered bushes and paths going through them leading to an orchard, allotment and fields.
15061161812
Karl @hexaquo.at · 24/03/2026
Implemented a variable-density Poisson disk sampler as a C++ GDExtension for #Godot: github.com/boku-ilen/go... It generates random points with a variable density, based on e.g. an image. should be very useful for scattering vegetation. based on this article: www.vertexfragment.com/ramblings/va...
the Godot icon, but it is depicted via randomly placed white dots with variable density. a higher density of dots causes the image to look brighter there, thus making the general contrast of the Godot robot head visible.
3646
Reposted by Karl
goosegardenstd.bsky.social @goosegardenstd.bsky.social · 14/03/2026
I just open-sourced a real-time datamosh CompositorEffect for Godot 4.4+ using motion vectors and temporal accumulation. Demo scene and presets included. github.com/goosegarden/... #Godot #gamedev
011026
Reposted by Karl
Roland Meyer @bildoperationen.bsky.social · 03/03/2026
C64 Screenshot: We killed the future and turned the past into training data
0369
Karl @hexaquo.at · 20/02/2026
I feel you! looks great!
011
Karl @hexaquo.at · 19/02/2026
Orchard #godot #gamedev
Screenshot of a 3D landscape in Godot. The camera stands in the middle of a row of approximately 2m tall fruit apple trees; the rows extend into the far distance, and the sun is low, making them cast long shadows.Screenshot of a 3D landscape in Godot. The camera looks at the sun, with layers of backlit apple trees in front of it.Screenshot of a 3D landscape in Godot. Apple trees again, with a higher sun, but more clouds.
4494
Reposted by Karl
Jendrik Illner @jendrikillner.bsky.social · 15/01/2026
Graphics Programming weekly - Issue 423 - January 11th, 2026 www.jendrikillner.com/post/graphic...
07423
Reposted by Karl
Lionel Lemarié @hikey.org · 14/01/2026
Fractal mitosis 3. #metalrt #rendering
2212
Karl @hexaquo.at · 13/01/2026
#godot #gamedev
Screenshot of a landscape rendered in Godot. View into a hilly landscape from a field track next to a sunflower field, with a small tree in the middle. The sun is fairly low.View up into the sky with a branch in the foreground and another tree in the distance. The sun is visible and creates some slight lens flares.View into the distance onto an expansive, slightly hilly landscape, with different agricultural fields. A few birds are flying in the distance.View over a field onto a village. The sun is low, creating a golden light.
2404
Karl @hexaquo.at · 11/01/2026
Nice! the per-streak chromatic fade looks really stylish! very happy to hear that my repo helped :)
010
Karl @hexaquo.at · 08/01/2026
Thanks! glad it helped :) The streaks are mostly adapted from here: chrisoat.com/papers/Oat-S... my code for doing multiple passes with it is a bit messy because of the texture ping-pong-ing, not sure if there's a better way to do that. Thanks, I want to extend and post that other scene sometime!
010
Karl @hexaquo.at · 08/01/2026
Yes! they're all created procedurally from the HDR buffer. for this glare effect, I do multiple passes of a directional blur.
110
Karl @hexaquo.at · 08/01/2026
Thanks, yeah feel free to take any code that's useful! I can get some nice anamorphic glare with the right settings; if you also want to stretch the lens flare ghosts, you could probably apply the glare blur filter (streak.glsl in my repo) to the buffer used for the ghosts. (or just warp the UVs)
Screenshot of the Godot editor with the sun producing a strong horizontal anamorphic glare. To the right, the corresponding settings are visible under the "Glare" tab": Streak count 2, attenuation 0.992, samples 6
110
Karl @hexaquo.at · 08/01/2026
The procedural lens flare and glare effect is open source, if someone wants to give it a try: github.com/kb173/godot-...
github.com
GitHub - kb173/godot-procedural-lens-flare
Contribute to kb173/godot-procedural-lens-flare development by creating an account on GitHub.
061
Karl @hexaquo.at · 08/01/2026
110
Karl @hexaquo.at · 08/01/2026
#godot #gamedev
3555
Karl @hexaquo.at · 31/12/2025
Really cool stuff! How is your action library licensed? I saw the code on your gitea instance, but didn't see a license there.
220
Karl @hexaquo.at · 29/12/2025
Yeah I think that approach definitely makes more sense for some projects! My original intention with this was mainly to communicate brightness better, that's why I went for the color buffer approach. (Though I'd also like to try it in a really stylized environment, dark with lots of glowing objects)
000
Karl @hexaquo.at · 29/12/2025
Lens Flare update: exposed all configurable parameters now. There's probably still a lot of potential for performance optimization, but I'd say it's somewhat usable :) You can check it out here, should work in any project (though requires some HDR care): github.com/kb173/godot-... #Godot #gamedev
1162
Reposted by Karl
LaurieWired @lauriewired.bsky.social · 23/12/2025
Gaussian splats are quite the rage lately (for good reason). Yet the technique is actually quite old!
 35 years ago, Lee Westover created the worlds first splat with the “UNC Head” dataset. A high-res CT scan...much too detailed for computers at the time.
15810
Reposted by Karl
Quest 64 Official @quest64official.bsky.social · 25/12/2025
4444391644
Karl @hexaquo.at · 25/12/2025
please do! (but maybe wait a few more days until it's a bit more usable and the most obvious performance issues are fixed)
010
Karl @hexaquo.at · 23/12/2025
and I feel you, figuring out how to get the texture into my compositor effect shader took me way too long 😅
010
Karl @hexaquo.at · 23/12/2025
True, it's hard to dial in & you need to make sure that things like the sun are actually bright (i.e. write values far above 1.0 into the color buffer). Also made me realize how most of the default settings don't care about this at all; even with physical light units, the sun disk isn't very bright.
210
Karl @hexaquo.at · 23/12/2025
If you want your #Godot game to look like Battlefield 3, I got you
Screenshot of a Godot scene with a blue sky and the sun visible through a large window in a concrete structure. The sun (and a reflection of the sun on the concrete) have a strong glare with 6 light streaks going outwards. There is also a lens flare effect with chromatic aberration, and the bloom uses a lens dirt texture to create large circular patterns of higher brightness (like dust on a lens).
0211
Karl @hexaquo.at · 20/12/2025
Looks great! I'd be very interested in a deep-dive into the tricks you're probably doing to deal with floating-point accuracy :)
100
Karl @hexaquo.at · 19/12/2025
I tested it real quick and this works for me: varying float random_offset; void vertex() { random_offset = (MODEL_MATRIX * vec4(0.0, 0.0, 0.0, 1.0)).y; } void fragment() { [...] float final_speed = TIME * (speed / 4.0) + random_offset; [...] }
020
Karl @hexaquo.at · 19/12/2025
also, I haven't used canvas_item shaders much, but it seems like the self_modulate property is passed into the COLOR variable of the shader; perhaps that could also be used to pass a random offset from GDScript into the shader without a uniform? I think the position hash would be preferable though
100
Karl @hexaquo.at · 19/12/2025
We usually hash the object position for pseudo-random offsets like that. e.g.: float rand(vec3 co){ return fract(sin(dot(co ,vec3(12.9898,78.233,54.1463))) * 43758.5453); } Perhaps you could do that using the object's translation, i.e. MODEL_MATRIX * vec3(0.0, 0.0, 0.0, 1.0)?
260
Karl @hexaquo.at · 18/12/2025
me every time I randomly see a photo of my home town on here
media.tenor.com
a man in a yellow shirt is sitting in a chair and pointing at something
Alt: meme gif: man in a yellow shirt is sitting in a chair and pointing at something excitedly
010
Karl @hexaquo.at · 18/12/2025
040
Karl @hexaquo.at · 18/12/2025
More work on procedural lens flares in #Godot. If you want to have a look at the (still very messy!) code: github.com/kb173/godot-... Outline of how it works: 1. Clip bright spots from the rendered image 2. Warp these spots to create ghosts and a halo 3. Blur 4. Overlay based on a dirt texture
5306
Reposted by Karl
Sebastian Aaltonen @sebaaltonen.bsky.social · 16/12/2025
My "No Graphics API" blog post is live! Please repost :) www.sebastianaaltonen.com/blog/no-grap... I spend 1.5 years doing this. Full rewrite last summer and another partial rewrite last month. As Hemingway said: "First draft of everything is always shit".
sebastianaaltonen.com
No Graphics API — Sebastian Aaltonen
Graphics APIs and shader languages have significantly increased in complexity over the past decade. It’s time to start discussing how to strip down the abstractions to simplify development, improve pe...
19474193
Karl @hexaquo.at · 16/12/2025
Finally learning CompositorEffects #Godot Lens flare based on this blog: john-chapman-graphics.blogspot.com/2013/02/pseu...
091
Karl @hexaquo.at · 14/12/2025
I was confused by this as well, but I guess it's consistent, since e.g. frame time will unavoidably also count gizmos. imo this panel is good for testing individual effects (turn them invisible/visible, check the difference), but I think testing entire scenes should generally be done in game mode.
000
Reposted by Karl
Jendrik Illner @jendrikillner.bsky.social · 08/12/2025
Graphics Programming weekly - Issue 419 - December 7th, 2025 www.jendrikillner.com/post/graphic...
04819
Reposted by Karl
Cécile Muller @wildpeaks.fr · 03/12/2025
Good idea using gaussians for tiled floor vegetation: yunfan.zone/gswt_webpage/ #3dgs #gamedev #rendering
111934
Karl @hexaquo.at · 05/12/2025
If you end up with any specific questions, let me know!
110
Karl @hexaquo.at · 05/12/2025
I don't think you can get it to look that clean with the subdivided-mesh approach (and it'd get really inefficient). I wrote a bit about geometry-based grass in Godot here, maybe that can give some inspiration: hexaquo.at/pages/grass-... no geometry shader needed, just normal high-level Godot stuff!
hexaquo.at
Grass Rendering Series Part 2: Full-Geometry Grass in Godot
In this second part of the Grass Rendering series, we’ll go over one possible implementation of grass in Godot. It will be full-geometry grass, meaning that each grass blade is an actual 3D object. Th...
110
Karl @hexaquo.at · 01/12/2025
Oh nice! I think I caught a glimpse of an orthographic camera up there, are you rendering the clouds to a separate texture and rendering that texture to the shadow pass (with some alpha threshold)?
140
Karl @hexaquo.at · 26/11/2025
I often talk about bent normals for billboards, and I keep having to mention the "if (!FRONT_FACING) NORMAL = -NORMAL" workaround for correct backface lighting. I realized I could fix that myself, so I opened a PR for an intuitive material option and render_mode: github.com/godotengine/... #Godot
Left: a plane and a sphere with billboards scattered on it. A text below says "Default", and some billboards are noticeably darker than the others.
Right: the same plane and sphere with billboards, but with smooth lighting without the dark billboards. The text below says "Keep Backface Normals".Schematic drawing. Left, titled "Original normals, matching geometry": a plane with an arrow pointing orthogonally outwards to the right, saying "original normal", and an arrow pointing into the opposite direction, saying "default behavior: flipped normal". Right, titled "Custom normals, do not match geometry": a plane with an arrow pointing straight up, parallel to the plane, saying "original normal", and the same arrow again, saying "intended backface normal". Another arrow points straight down, saying "default behavior: flipped normal".
0150
Karl @hexaquo.at · 24/11/2025
Fun sidenote: Resource.duplicate takes a bool for whether it should do a deep-copy. Since bools and ints are compatible, duplicate(true) is valid for both Nodes and Resources, but does not actually do a deep-copy for Nodes since 1 is just the DUPLICATE_SIGNALS flag. Had a fun bug caused by that once
140
Reposted by Karl
Andrew Willmott @andrewwillmott.bsky.social · 18/11/2025
I don't understand how they could get (?:(?:\"|'|\]|\}|\\|\d|(?:nan|infinity|true|false|null|undefined|symbol|math)|\`|\-|\+)+[)]*;?((?:\s|-|~|!|{}|\|\||\+)*.*(?:.*=.*))) so wrong
171