<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Graphics Programming on Jan Kelemen - Personal site</title><link>https://jk.rubberdax.xyz/tags/graphics-programming/</link><description>Recent content in Graphics Programming on Jan Kelemen - Personal site</description><generator>Hugo</generator><language>en</language><copyright>© [Jan Kelemen](https://www.rubberdax.xyz)</copyright><lastBuildDate>Mon, 28 Jul 2025 00:00:00 +0000</lastBuildDate><atom:link href="https://jk.rubberdax.xyz/tags/graphics-programming/index.xml" rel="self" type="application/rss+xml"/><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><item><title>It Goes In The Square Hole</title><link>https://jk.rubberdax.xyz/post/2024-07-05-it-goes-in-the-square-hole/</link><pubDate>Fri, 05 Jul 2024 00:00:00 +0000</pubDate><guid>https://jk.rubberdax.xyz/post/2024-07-05-it-goes-in-the-square-hole/</guid><description>&lt;p&gt;I gave a hint that I wanted to study how to do mouse picking in a 3D environment properly.
For that, I&amp;rsquo;ve chosen to go with the route of raycasting from the mouse position into the scene and remake the scene from the popular video &lt;a href="https://www.youtube.com/watch?v=cUbIkNUFs-4"&gt;The Original Square Hole Girl Video + The Redemption&lt;/a&gt;.
Link to the source code: &lt;a href="https://github.com/jan-kelemen/graphics-demos/tree/master/geos"&gt;jan-kelemen/geos&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;You can see the results 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/vkjBM03vehw?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="mouse-picking"&gt;Mouse picking&lt;/h1&gt;
&lt;p&gt;As mentioned, mouse picking is implemented by raycasting. For this, I&amp;rsquo;ve started with a single cube with 2x2x2 dimensions, also known as the default Blender cube.
This was much easier to start since the dimensions it uses are trivial to debug if some part of the calculation isn&amp;rsquo;t correct.&lt;/p&gt;</description></item><item><title>Chess engine visualization</title><link>https://jk.rubberdax.xyz/post/2024-06-13-chess-engine-visualization/</link><pubDate>Thu, 13 Jun 2024 00:00:00 +0000</pubDate><guid>https://jk.rubberdax.xyz/post/2024-06-13-chess-engine-visualization/</guid><description>&lt;p&gt;In the previous post &lt;a href="https://jk.rubberdax.xyz/post/2024-05-14-remaking-world-11-mostly"&gt;Remaking World 1-1 with Vulkan, mostly&lt;/a&gt; I&amp;rsquo;ve shown my progress with learning graphics programming.
In the meantime, I finished another project &lt;em&gt;pawn&lt;/em&gt;, a UCI protocol &amp;ldquo;compatible&amp;rdquo; GUI rendered with Vulkan API. Link to the source code: &lt;a href="https://github.com/jan-kelemen/graphics-demos/tree/master/pawn"&gt;jan-kelemen/pawn&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The original idea that I had in mind when I started was to allow the player to play against the chess engine and for the board to be rendered in an isometric projection and 2.5D, kind of like &lt;a href="https://store.steampowered.com/app/2271360/IsoChess/"&gt;IsoChess&lt;/a&gt;.
This changed a bit along the way, I&amp;rsquo;ve kept the isometric view of the board, but the pieces and the board are full 3D models, it turns out it&amp;rsquo;s easier to find 3D models than the ones that would fit into the 2.5D style.
The second difference is that the player doesn&amp;rsquo;t exist, the chess engine plays against itself, I&amp;rsquo;ll explain the reasons for this later.&lt;/p&gt;</description></item><item><title>Remaking World 1-1 with Vulkan, mostly</title><link>https://jk.rubberdax.xyz/post/2024-05-14-remaking-world-11-mostly/</link><pubDate>Tue, 14 May 2024 00:00:00 +0000</pubDate><guid>https://jk.rubberdax.xyz/post/2024-05-14-remaking-world-11-mostly/</guid><description>&lt;p&gt;A couple of months ago (2 to be exact), I started learning graphics programming with &lt;a href="https://www.vulkan.org"&gt;Vulkan API&lt;/a&gt;.
I went through the &lt;a href="https://vulkan-tutorial.com"&gt;Vulkan Tutorial&lt;/a&gt;, then made a &lt;a href="https://github.com/jan-kelemen/graphics-demos/tree/master/vkpong"&gt;Pong&lt;/a&gt;
clone and a &lt;a href="https://github.com/jan-kelemen/graphics-demos/tree/master/vkchip8"&gt;CHIP-8 emulator&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Sidenote, before this I&amp;rsquo;d never done any serious graphics programming at all, so use the information given here as a learning resource at your own risk.&lt;/p&gt;
&lt;p&gt;After that, it was time to increase the complexity a bit, so I decided to remake the first level from Super Mario Bros, well, mostly.
You can take a look at the gameplay footage of how far I&amp;rsquo;ve gotten in the video below.&lt;/p&gt;</description></item></channel></rss>