<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Niku on Jan Kelemen - Personal site</title><link>https://jk.rubberdax.xyz/tags/niku/</link><description>Recent content in Niku on Jan Kelemen - Personal site</description><generator>Hugo</generator><language>en</language><copyright>© [Jan Kelemen](https://www.rubberdax.xyz)</copyright><lastBuildDate>Mon, 16 Mar 2026 18:00:00 +0000</lastBuildDate><atom:link href="https://jk.rubberdax.xyz/tags/niku/index.xml" rel="self" type="application/rss+xml"/><item><title>The Editor and Artifactory</title><link>https://jk.rubberdax.xyz/post/2026-03-16-the-editor-and-artifactory/</link><pubDate>Mon, 16 Mar 2026 18:00:00 +0000</pubDate><guid>https://jk.rubberdax.xyz/post/2026-03-16-the-editor-and-artifactory/</guid><description>&lt;p&gt;Back to writing about updates on my game engine &lt;a href="https://github.com/jan-kelemen/niku"&gt;jan-kelemen/niku&lt;/a&gt;!&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
 &lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/cgVjCQWCKhg?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
 &lt;/div&gt;

&lt;h1 id="editor"&gt;Editor&lt;/h1&gt;
&lt;p&gt;In the previous post, I mentioned that I started working on the game engine editor.
With the hope of making some forward progress on this topic, I&amp;rsquo;ve decided to use ImGui as the GUI framework in the editor.
Instead of reinventing a GUI framework on my own or using a different library for the GUI.&lt;/p&gt;</description></item><item><title>Abusing GPUs</title><link>https://jk.rubberdax.xyz/post/2026-01-11-abusing-gpus/</link><pubDate>Sun, 11 Jan 2026 00:00:00 +0000</pubDate><guid>https://jk.rubberdax.xyz/post/2026-01-11-abusing-gpus/</guid><description>&lt;p&gt;I figured out we no longer have to do software rendering, the Greed Processing Units are capable of doing graphics.
So I continued working on my game engine &lt;a href="https://github.com/jan-kelemen/niku"&gt;jan-kelemen/niku&lt;/a&gt;.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
 &lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/ULX-BmqDTvs?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
 &lt;/div&gt;

&lt;p&gt;With the exception of &lt;a href="https://github.com/toji/sponza-optimized"&gt;toji/optimized-sponza&lt;/a&gt; asset, all other assets are from &lt;a href="https://github.com/KhronosGroup/glTF-Sample-Assets"&gt;KhronosGroup/glTF-Sample-Assets&lt;/a&gt;.&lt;/p&gt;
&lt;h1 id="compressed-texture-formats"&gt;Compressed texture formats&lt;/h1&gt;
&lt;p&gt;According to the profiling results of the &lt;code&gt;gltfviewer&lt;/code&gt; demo, rendering is bottlenecked by the sampling of texture images.
I&amp;rsquo;ve known about this for quite some time already, though I think I can&amp;rsquo;t do much about it, since the shader cannot invent pixel values out of thin air.&lt;/p&gt;</description></item><item><title>I Still Struggle With Triangles</title><link>https://jk.rubberdax.xyz/post/2025-11-20-i-still-struggle-with-triangles/</link><pubDate>Thu, 20 Nov 2025 00:00:00 +0000</pubDate><guid>https://jk.rubberdax.xyz/post/2025-11-20-i-still-struggle-with-triangles/</guid><description>&lt;p&gt;Life sometimes gets in the way of game engine development.
Thanks to Hrvoje for reminding me that I need to publish a new update on my game engine &lt;a href="https://github.com/jan-kelemen/niku"&gt;jan-kelemen/niku&lt;/a&gt;.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
 &lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/6sTx6-KbQ7Y?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
 &lt;/div&gt;

&lt;p&gt;Video quality has been massacred by YouTube&amp;rsquo;s compression algorithm.&lt;/p&gt;
&lt;h1 id="winter-is-coming"&gt;Winter is coming&lt;/h1&gt;
&lt;p&gt;Heating bills are expensive, but thankfully, I have a 220W space heater in my PC.
I&amp;rsquo;ve decided it&amp;rsquo;s time to add ray tracing support to the rendering engine.
For this purpose, I&amp;rsquo;ve created a new demo &lt;code&gt;heatx&lt;/code&gt;.
I&amp;rsquo;ll admit, I&amp;rsquo;ve spent way too much time playing Factorio in the meantime. The demo name is a reference to &lt;a href="https://wiki.factorio.com/Heat_exchanger"&gt;Heat exchanger&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>niku: Year One</title><link>https://jk.rubberdax.xyz/post/2025-08-22-niku-year-one/</link><pubDate>Fri, 22 Aug 2025 00:00:00 +0000</pubDate><guid>https://jk.rubberdax.xyz/post/2025-08-22-niku-year-one/</guid><description>&lt;p&gt;After working for a year on my game engine &lt;a href="https://github.com/jan-kelemen/niku"&gt;jan-kelemen/niku&lt;/a&gt;, time has come to publish an anniversary release &lt;a href="https://github.com/jan-kelemen/niku/releases/tag/0.1"&gt;0.1&lt;/a&gt;.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
 &lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/7eTE_94SNc0?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
 &lt;/div&gt;

&lt;h1 id="what-was-done"&gt;What was done?&lt;/h1&gt;
&lt;p&gt;The engine development is primarily done with demo applications that reuse the same codebase. Currently, there are three of them:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;gltfviewer&lt;/code&gt; - Forward 3D renderer for glTF files implementing a Physically Based Rendering workflow&lt;/li&gt;
&lt;li&gt;&lt;code&gt;galileo&lt;/code&gt; - Deferred 3D renderer with physics and scripting&lt;/li&gt;
&lt;li&gt;&lt;code&gt;reshed&lt;/code&gt; - Text editor with bitmap font rendering and GLSL syntax highlighting&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The complete list of features for each is shown in the intro video.&lt;/p&gt;</description></item><item><title>Ligatures... The Final Frontier</title><link>https://jk.rubberdax.xyz/post/2025-07-28-ligatures-the-final-frontier/</link><pubDate>Mon, 28 Jul 2025 00:00:00 +0000</pubDate><guid>https://jk.rubberdax.xyz/post/2025-07-28-ligatures-the-final-frontier/</guid><description>&lt;p&gt;Text rendering update for my game engine &lt;a href="https://github.com/jan-kelemen/niku"&gt;jan-kelemen/niku&lt;/a&gt;, now without missing glyphs.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
 &lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/M0Soxc6BoRM?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
 &lt;/div&gt;

&lt;p&gt;For the demo video, I&amp;rsquo;ve increased the font size; YouTube renders it a bit better than the previous one.&lt;/p&gt;
&lt;h1 id="the-missing-glyph"&gt;The missing glyph&lt;/h1&gt;
&lt;p&gt;In the previous &lt;a href="https://jk.rubberdax.xyz/post/2025-06-04-text-hates-us"&gt;post&lt;/a&gt;, I&amp;rsquo;ve shown that the rendering of variable spaced fonts is mostly working.
The missing part was ligatures, when multiple letters from the text are combined into a single glyph.&lt;/p&gt;</description></item><item><title>Text Hates Us</title><link>https://jk.rubberdax.xyz/post/2025-06-04-text-hates-us/</link><pubDate>Wed, 04 Jun 2025 00:00:00 +0000</pubDate><guid>https://jk.rubberdax.xyz/post/2025-06-04-text-hates-us/</guid><description>&lt;p&gt;Adding support for text rendering has been one of the things I avoided for a long time in my game engine &lt;a href="https://github.com/jan-kelemen/niku"&gt;jan-kelemen/niku&lt;/a&gt;.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
 &lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/6OVR9dF1lCI?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
 &lt;/div&gt;

&lt;p&gt;The video is a bit blurry at times, YouTube compression algorithm doesn&amp;rsquo;t like content like this.&lt;/p&gt;
&lt;h1 id="new-engine-demo"&gt;New engine demo&lt;/h1&gt;
&lt;p&gt;To support text rendering, I&amp;rsquo;ve created a new engine demo, &lt;code&gt;reshed&lt;/code&gt;.
The intended scope is to get a text editor that can edit GLSL shader files, it derives its name from this intended purpose, &lt;strong&gt;RE&lt;/strong&gt;al &lt;strong&gt;SH&lt;/strong&gt;ader &lt;strong&gt;ED&lt;/strong&gt;itor.
There is also a hope that I&amp;rsquo;ll clean up the event handling during its development.&lt;/p&gt;</description></item><item><title>The Invisibles</title><link>https://jk.rubberdax.xyz/post/2025-04-27-the-invisibles/</link><pubDate>Sun, 27 Apr 2025 00:00:00 +0000</pubDate><guid>https://jk.rubberdax.xyz/post/2025-04-27-the-invisibles/</guid><description>&lt;p&gt;It&amp;rsquo;s quite easy to spend weeks making almost no visible progress on my game engine &lt;a href="https://github.com/jan-kelemen/niku"&gt;jan-kelemen/niku&lt;/a&gt;.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
 &lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/-syid1NaFCg?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
 &lt;/div&gt;

&lt;h1 id="shadow-mapping"&gt;Shadow mapping&lt;/h1&gt;
&lt;p&gt;After postponing working on shadows from the beginning of this project, I&amp;rsquo;ve finally implemented shadow mapping in the &lt;code&gt;gltfviewer&lt;/code&gt;.
At the start of the video, there is a comparison of the Sponza scene rendered just with the ambient lighting,
then with the added directional light and then with the shadows cast with that directional light.&lt;/p&gt;</description></item><item><title>Finding The Way Home</title><link>https://jk.rubberdax.xyz/post/2025-03-13-finding-the-way-home/</link><pubDate>Thu, 13 Mar 2025 00:00:00 +0000</pubDate><guid>https://jk.rubberdax.xyz/post/2025-03-13-finding-the-way-home/</guid><description>&lt;p&gt;I didn&amp;rsquo;t intend to be making so much my game engine &lt;a href="https://github.com/jan-kelemen/niku"&gt;jan-kelemen/niku&lt;/a&gt; devlog about spheres.
They keep showing up like rocks from &lt;a href="https://www.imdb.com/title/tt0448011/"&gt;KNOW1NG (2009)&lt;/a&gt;.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
 &lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/EWkgoKozUJA?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
 &lt;/div&gt;

&lt;h1 id="pathfinding"&gt;Pathfinding&lt;/h1&gt;
&lt;p&gt;Once the navigation mesh of the world is generated, we can use it for its intended purpose, pathfinding between different points of the world.
For this, I&amp;rsquo;ve used the other part of the &lt;a href="https://recastnav.com"&gt;Recast Navigation&lt;/a&gt; library, Detour, which handles pathfinding and navigation mesh querying.&lt;/p&gt;</description></item><item><title>Navigating Bad Assumptions</title><link>https://jk.rubberdax.xyz/post/2025-02-07-navigating-bad-assumptions/</link><pubDate>Fri, 07 Feb 2025 00:00:00 +0000</pubDate><guid>https://jk.rubberdax.xyz/post/2025-02-07-navigating-bad-assumptions/</guid><description>&lt;p&gt;A regular update on the state of my game engine &lt;a href="https://github.com/jan-kelemen/niku"&gt;jan-kelemen/niku&lt;/a&gt;.
Some past mistakes were corrected, and hopefully, no new ones were made.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
 &lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/fWpssvL9gOc?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
 &lt;/div&gt;

&lt;h1 id="asset-loading-2-electric-boogaloo"&gt;Asset loading 2: Electric Boogaloo&lt;/h1&gt;
&lt;p&gt;The last time I implemented loading of glTF files, I loaded the model geometry to GPU buffers that can also be accessed from the CPU before finally transferring it to dedicated GPU buffers.
This approach worked well for &lt;code&gt;gltfviewer&lt;/code&gt; as it didn&amp;rsquo;t need to access the geometry.&lt;/p&gt;</description></item><item><title>Eppur si muove</title><link>https://jk.rubberdax.xyz/post/2025-01-11-eppur-si-muove/</link><pubDate>Sat, 11 Jan 2025 00:00:00 +0000</pubDate><guid>https://jk.rubberdax.xyz/post/2025-01-11-eppur-si-muove/</guid><description>&lt;p&gt;New year, new demo application for my game engine &lt;a href="https://github.com/jan-kelemen/niku"&gt;jan-kelemen/niku&lt;/a&gt;.
The new demo application is named &lt;code&gt;galileo&lt;/code&gt;.
Its continuing mission to integrate physics simulation and scripting language support into the engine.&lt;/p&gt;
&lt;p&gt;I also took the opportunity to clean up some things.
Here is the &lt;a href="https://github.com/jan-kelemen/niku/compare/3adf002453d55a2b654402def252812185982417...760b7e6231d363328396b3eeb9a3562b8041ad60"&gt;diff&lt;/a&gt; compared to the state shown in the previous post.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
 &lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/PhTNq3U2Q8M?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
 &lt;/div&gt;

&lt;h1 id="physics"&gt;Physics&lt;/h1&gt;
&lt;p&gt;I went over the basics of using a physics engine in &lt;a href="https://jk.rubberdax.xyz/2024/07/05/it-goes-in-the-square-hole.html"&gt;It Goes In The Square Hole&lt;/a&gt; and &lt;a href="https://jk.rubberdax.xyz/2024/08/10/rendering-medvednica-from-heightmap.html"&gt;Rendering Medvednica From a Heightmap&lt;/a&gt;.
Compared to that post I&amp;rsquo;ve decided to switch from using the &lt;a href="https://github.com/bulletphysics/bullet3"&gt;Bullet Physics SDK&lt;/a&gt; to &lt;a href="https://github.com/jrouwe/JoltPhysics"&gt;Jolt Physics&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Sidequests And Loose Ends</title><link>https://jk.rubberdax.xyz/post/2024-11-25-sidequests-and-loose-ends/</link><pubDate>Mon, 25 Nov 2024 00:00:00 +0000</pubDate><guid>https://jk.rubberdax.xyz/post/2024-11-25-sidequests-and-loose-ends/</guid><description>&lt;p&gt;Once more I continued to work on the &lt;code&gt;gltfviewer&lt;/code&gt; demo for my game engine &lt;a href="https://github.com/jan-kelemen/niku"&gt;jan-kelemen/niku&lt;/a&gt;.
There were a couple of rendering features that weren&amp;rsquo;t yet covered and some quality of life improvements.
&lt;a href="https://github.com/jan-kelemen/niku/compare/aa9c25f3440eee946501ec95de4dc155bebd00f2...3adf002453d55a2b654402def252812185982417"&gt;Diff&lt;/a&gt; from the state shown in previous post.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
 &lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/siqQKH8Gx48?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
 &lt;/div&gt;

&lt;p&gt;As before all sample assets shown are from &lt;a href="https://github.com/KhronosGroup/glTF-Sample-Assets"&gt;KhronosGroup/glTF-Sample-Assets&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Rendering Physically Based Bugs</title><link>https://jk.rubberdax.xyz/post/2024-10-26-rendering-physically-based-bugs/</link><pubDate>Sat, 26 Oct 2024 00:00:00 +0000</pubDate><guid>https://jk.rubberdax.xyz/post/2024-10-26-rendering-physically-based-bugs/</guid><description>&lt;p&gt;I continued the work on the &lt;a href="https://en.wikipedia.org/wiki/Physically_based_rendering"&gt;PBR&lt;/a&gt; rendering demo for my game engine &lt;a href="https://github.com/jan-kelemen/niku"&gt;jan-kelemen/niku&lt;/a&gt;.
Although I thought most of the preparation work was already done, I guess it&amp;rsquo;s never enough for things like this.&lt;/p&gt;
&lt;p&gt;Here is a complete &lt;a href="https://github.com/jan-kelemen/niku/compare/19489b3fc14df1d69e1b876e3849941ac104ec36...aa9c25f3440eee946501ec95de4dc155bebd00f2"&gt;diff&lt;/a&gt;
between the state shown previously and as it is now.
The video demonstrates a couple of scenes and assets shown previously.
Illumination is done with point lights using linear attenuation.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
 &lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/288VO4wo24M?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
 &lt;/div&gt;

&lt;p&gt;I switched to using &lt;a href="https://github.com/KhronosGroup/ToneMapping/tree/main/PBR_Neutral"&gt;PBR Neutral&lt;/a&gt; tone mapping and real linear to sRGB conversion instead of Reinhard tone mapping and gamma correction.
They look better, &lt;a href="https://graphics-programming.org/resources/tonemapping/index.html"&gt;here&lt;/a&gt; is a nice comparison of various tone mapping functions.&lt;/p&gt;</description></item><item><title>Preparing For Physically Based Rendering</title><link>https://jk.rubberdax.xyz/post/2024-09-27-preparing-for-physically-based-rendering/</link><pubDate>Fri, 27 Sep 2024 00:00:00 +0000</pubDate><guid>https://jk.rubberdax.xyz/post/2024-09-27-preparing-for-physically-based-rendering/</guid><description>&lt;p&gt;First official devlog of my game engine &lt;a href="https://github.com/jan-kelemen/niku"&gt;jan-kelemen/niku&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;Since I&amp;rsquo;ve moved the code to a dedicated repository, I&amp;rsquo;ve done some work on the rendering side of things.
The first goal is to get a &lt;a href="https://en.wikipedia.org/wiki/Physically_based_rendering"&gt;Physically Based Rendering (PBR)&lt;/a&gt; working in at least somewhat reusable state for other projects.
I started by making a demo application that displays glTF files. The current state of the demo is shown in the video below.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
 &lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/WdiDkjNU1aw?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
 &lt;/div&gt;

&lt;p&gt;It doesn&amp;rsquo;t do any PBR for now, but most of the preparation work is done, I&amp;rsquo;ll start working on the PBR soon™.&lt;/p&gt;</description></item><item><title>I See Spheres Now</title><link>https://jk.rubberdax.xyz/post/2024-08-25-i-see-spheres-now/</link><pubDate>Sun, 25 Aug 2024 00:00:00 +0000</pubDate><guid>https://jk.rubberdax.xyz/post/2024-08-25-i-see-spheres-now/</guid><description>&lt;p&gt;Since I had never actually written a raytracer, I wanted to learn about this topic by following along with the popular
&lt;a href="https://raytracing.github.io/books/RayTracingInOneWeekend.html"&gt;Ray Tracing in One Weekend&lt;/a&gt; book.
The title doesn&amp;rsquo;t lie, my first CPU raytracer did take only one weekend.&lt;/p&gt;
&lt;p&gt;Afterward, I tried making the same raytracer using a compute shader and with the possibility to move around the scene in real time.
Results are in the video below, link to the source code: &lt;a href="https://github.com/jan-kelemen/graphics-demos/tree/master/beam"&gt;jan-kelemen/beam&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Rendering Medvednica From a Heightmap</title><link>https://jk.rubberdax.xyz/post/2024-08-10-rendering-medvednica-from-heightmap/</link><pubDate>Sat, 10 Aug 2024 00:00:00 +0000</pubDate><guid>https://jk.rubberdax.xyz/post/2024-08-10-rendering-medvednica-from-heightmap/</guid><description>&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=AyvbysGaSmI"&gt;Na Sljeme, na Sljeme na Sljeme&amp;hellip;&lt;/a&gt;.
I started this project to explore the usage of Bullet&amp;rsquo;s &lt;a href="https://pybullet.org/Bullet/BulletFull/classbtHeightfieldTerrainShape.html"&gt;btHeightfieldTerrainShape&lt;/a&gt; collision shape, initial idea was to generate a heightmap using &lt;a href="https://en.wikipedia.org/wiki/Perlin_noise"&gt;Perlin noise&lt;/a&gt;.
I ended up using a static heightmap as I didn&amp;rsquo;t like the results I was getting with the terrain generated from using plain noise.&lt;/p&gt;
&lt;p&gt;Results are in the video below, Link to the source code: &lt;a href="https://github.com/jan-kelemen/graphics-demos/tree/master/soil"&gt;jan-kelemen/soil&lt;/a&gt;&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
 &lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/wr8dgD03Gz0?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
 &lt;/div&gt;

&lt;h1 id="heightmaps"&gt;Heightmaps&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Heightmap"&gt;Heightmaps&lt;/a&gt; are images that are used to represent the height of a terrain.
Values taken from this image are mapped to a rectangular grid, combining these two things gives us a coordinate in 3D space. Brighter values represent a higher point in the space.
Below is the image I&amp;rsquo;ve used for this project, although you can generate a heightmap for any point of Earth with a site like &lt;a href="https://manticorp.github.io/unrealheightmap/#latitude/45.86132487333674/longitude/15.97686767578125/zoom/11/outputzoom/12/width/1025/height/1025"&gt;manticorp.github.io/unrealheightmap&lt;/a&gt;.&lt;/p&gt;</description></item></channel></rss>