<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Blog Posts on PatchSalts.com</title>
        <link>https://patchsalts.com/categories/blog-posts/</link>
        <description>Recent content in Blog Posts on PatchSalts.com</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>en-us</language>
        <copyright>Patch Salts</copyright>
        <lastBuildDate>Tue, 13 Oct 2026 13:51:24 -0400</lastBuildDate><atom:link href="https://patchsalts.com/categories/blog-posts/index.xml" rel="self" type="application/rss+xml" /><item>
            <title>October 2026 Brief Update</title>
            <link>https://patchsalts.com/post/brief-update-october-2026/</link>
            <pubDate>Tue, 13 Oct 2026 13:51:24 -0400</pubDate>
            <guid>https://patchsalts.com/post/brief-update-october-2026/</guid>
            <description>&lt;img src=&#34;https://patchsalts.com/post/brief-update-october-2026/donkey-kong-ntsc-bad.png&#34; alt=&#34;Featured image of post October 2026 Brief Update&#34; /&gt;&lt;p&gt;Hey everyone, just thought I&amp;rsquo;d give a brief update. Around the same time I started working on the retro shader stuff, I started getting full-day headaches every day. It&amp;rsquo;s been about 2 weeks of this and it&amp;rsquo;s made most tasks somewhat difficult. I had to take it easy and try to micro-manage my health since relatively few things would make it better and many things would make it worse. Today has been the first day in a while my brain has felt kinda normal since the headaches started.&lt;/p&gt;&#xA;&lt;p&gt;Despite that, I&amp;rsquo;m still intent on working on shader stuff if possible, since it has been fun. I&amp;rsquo;d like to be able to use mGBA to emulate Super Game Boy games as if I was playing them on a CRT screen. You see, the Super Game Boy is a Super Nintendo add-on that allowed gamers to play their Game Boy games oon their SNES, with a couple of features (like specialized palettes and borders) added. I have the analog video filter for it basically ported over (it&amp;rsquo;s Themaister&amp;rsquo;s NTSC-256px-Composite shader), but there&amp;rsquo;s a few small problems.&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;mGBA always renders shader passes to an integer framebuffer&lt;/p&gt;&#xA;&lt;p&gt;The shader I&amp;rsquo;m porting uses 2 passes. The first basically processes input RGB pixels and renders the corresponding analog signal values to a cache, and the second pass reads the cache, does some more processing to simulate the analog signal characteristics, and renders the result back into RGB pixels. When the first pass is rendered to an integer framebuffer, some information is lost, and the output pixels look very magenta-ish instead of their intended colors.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;Super Mario Kart with no shader in ares&#34; class=&#34;gallery-image&#34; data-flex-basis=&#34;320px&#34; data-flex-grow=&#34;133&#34; height=&#34;1080&#34; loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://patchsalts.com/post/brief-update-october-2026/mario-kart-plain.png&#34; srcset=&#34;https://patchsalts.com/post/brief-update-october-2026/mario-kart-plain_hu_a85754890f91cb3.png 800w, https://patchsalts.com/post/brief-update-october-2026/mario-kart-plain.png 1440w&#34; width=&#34;1440&#34;&gt;&#xA;&lt;img alt=&#34;Super Mario Kart with the NTSC shader in ares&#34; class=&#34;gallery-image&#34; data-flex-basis=&#34;320px&#34; data-flex-grow=&#34;133&#34; height=&#34;1080&#34; loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://patchsalts.com/post/brief-update-october-2026/mario-kart-ntsc-1.png&#34; srcset=&#34;https://patchsalts.com/post/brief-update-october-2026/mario-kart-ntsc-1_hu_20042e16aca568a3.png 800w, https://patchsalts.com/post/brief-update-october-2026/mario-kart-ntsc-1.png 1440w&#34; width=&#34;1440&#34;&gt;&#xA;&lt;img alt=&#34;Donkey Kong with no shader in mGBA&#34; class=&#34;gallery-image&#34; data-flex-basis=&#34;320px&#34; data-flex-grow=&#34;133&#34; height=&#34;1080&#34; loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://patchsalts.com/post/brief-update-october-2026/donkey-kong-plain.png&#34; srcset=&#34;https://patchsalts.com/post/brief-update-october-2026/donkey-kong-plain_hu_b1b9822f5f185ce3.png 800w, https://patchsalts.com/post/brief-update-october-2026/donkey-kong-plain.png 1440w&#34; width=&#34;1440&#34;&gt;&#xA;&lt;img alt=&#34;Donkey Kong with my ported NTSC shader in mGBA… magenta???&#34; class=&#34;gallery-image&#34; data-flex-basis=&#34;320px&#34; data-flex-grow=&#34;133&#34; height=&#34;1080&#34; loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://patchsalts.com/post/brief-update-october-2026/donkey-kong-ntsc-bad.png&#34; srcset=&#34;https://patchsalts.com/post/brief-update-october-2026/donkey-kong-ntsc-bad_hu_5b26d226c0bf6c0b.png 800w, https://patchsalts.com/post/brief-update-october-2026/donkey-kong-ntsc-bad.png 1440w&#34; width=&#34;1440&#34;&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;mGBA doesn&amp;rsquo;t pass information about frame count/time to shaders&lt;/p&gt;&#xA;&lt;p&gt;The shader I&amp;rsquo;m porting uses information about the number of frames being rendered to simulate signal jitter. mGBA currently doesn&amp;rsquo;t pass any of that info to its shaders, so this effect can&amp;rsquo;t be simulated yet.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;Super Mario Kart with the NTSC shader in ares&#34; class=&#34;gallery-image&#34; data-flex-basis=&#34;320px&#34; data-flex-grow=&#34;133&#34; height=&#34;1080&#34; loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://patchsalts.com/post/brief-update-october-2026/mario-kart-ntsc-1.png&#34; srcset=&#34;https://patchsalts.com/post/brief-update-october-2026/mario-kart-ntsc-1_hu_20042e16aca568a3.png 800w, https://patchsalts.com/post/brief-update-october-2026/mario-kart-ntsc-1.png 1440w&#34; width=&#34;1440&#34;&gt;&#xA;&lt;img alt=&#34;The next frame… notice the way the wobbliness of solid vertical lines changes from one to the other&#34; class=&#34;gallery-image&#34; data-flex-basis=&#34;320px&#34; data-flex-grow=&#34;133&#34; height=&#34;1080&#34; loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://patchsalts.com/post/brief-update-october-2026/mario-kart-ntsc-2.png&#34; srcset=&#34;https://patchsalts.com/post/brief-update-october-2026/mario-kart-ntsc-2_hu_bedf018d23d7a5b2.png 800w, https://patchsalts.com/post/brief-update-october-2026/mario-kart-ntsc-2.png 1440w&#34; width=&#34;1440&#34;&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;mGBA doesn&amp;rsquo;t have any aspect ratio correction features&lt;/p&gt;&#xA;&lt;p&gt;As stated in my &lt;a class=&#34;link&#34; href=&#34;https://patchsalts.com/post/retro-shaders-are-important/&#34; &gt;last post&lt;/a&gt;, video output from older consoles like the SNES were almost always stretched horizontally a little bit, but currently mGBA provides no way to simulate this characteristic&amp;hellip; after all it&amp;rsquo;s technically not an SNES emulator, it&amp;rsquo;s a Game Boy (Color/Advance) emulator. (Although I remember reading that sometimes a bit of SNES emulation is needed to get the SGB features working, so the lines are blurred there.)&lt;/p&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;Donkey Kong with no shader in mGBA&#34; class=&#34;gallery-image&#34; data-flex-basis=&#34;320px&#34; data-flex-grow=&#34;133&#34; height=&#34;1080&#34; loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://patchsalts.com/post/brief-update-october-2026/donkey-kong-plain.png&#34; srcset=&#34;https://patchsalts.com/post/brief-update-october-2026/donkey-kong-plain_hu_b1b9822f5f185ce3.png 800w, https://patchsalts.com/post/brief-update-october-2026/donkey-kong-plain.png 1440w&#34; width=&#34;1440&#34;&gt;&#xA;&lt;img alt=&#34;At proper SNES ratio, it might look something like this&#34; class=&#34;gallery-image&#34; data-flex-basis=&#34;320px&#34; data-flex-grow=&#34;133&#34; height=&#34;1080&#34; loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://patchsalts.com/post/brief-update-october-2026/donkey-kong-stretch.png&#34; srcset=&#34;https://patchsalts.com/post/brief-update-october-2026/donkey-kong-stretch_hu_9e3f4d47e84dc6e7.png 800w, https://patchsalts.com/post/brief-update-october-2026/donkey-kong-stretch.png 1440w&#34; width=&#34;1440&#34;&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;I&amp;rsquo;m currently doing work on the first point, and I plan on submitting a pull request to get the feature implemented in mainstream mGBA. After that, I&amp;rsquo;ll also work on the next 2 points. I expect the next few posts might still be focusing on that for a while :P&lt;/p&gt;&#xA;&lt;p&gt;It is important to remember that while there is no right way to play an older game these days, I simply don&amp;rsquo;t want everyone to forget what the original look and feel was. &amp;ldquo;Sonic was an ugly game because the checkerboard patterns hurt my eyes&amp;rdquo; shouldn&amp;rsquo;t be the takeaway people have after playing it on a modern system, ignorant that you probably weren&amp;rsquo;t supposed to be seeing the checkerboard patterns at all (again, see the &lt;a class=&#34;link&#34; href=&#34;https://patchsalts.com/post/retro-shaders-are-important/&#34; &gt;previous blog post&lt;/a&gt; for info about the blending of dithered patterns). I would prefer to simulate the full SNES experience when playing a game in SGB mode, and I&amp;rsquo;d like to enable that experience for myself and others, but the lines are especially blurred in this case since those are technically still Game Boy games. I wouldn&amp;rsquo;t blame anyone for playing games in SGB mode with no video filters or correction at all, since it could be argued that they simply want to play the Game Boy game and the added features are just a nice bonus.&lt;/p&gt;&#xA;&lt;p&gt;Thank you so much for reading, have a nice day.&lt;/p&gt;&#xA;&lt;p&gt;– Patch&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>Retro shaders are important</title>
            <link>https://patchsalts.com/post/retro-shaders-are-important/</link>
            <pubDate>Fri, 02 Oct 2026 15:13:50 -0400</pubDate>
            <guid>https://patchsalts.com/post/retro-shaders-are-important/</guid>
            <description>&lt;img src=&#34;https://patchsalts.com/post/retro-shaders-are-important/ewww-chunky.png&#34; alt=&#34;Featured image of post Retro shaders are important&#34; /&gt;&lt;p&gt;This week is a bit of a brief update. I do have something to show y&amp;rsquo;all but I spent most of the week learning about shader development for emulators, so please accept my humble ramblings for a while before I show you what I actually did.&lt;/p&gt;&#xA;&lt;p&gt;One thing I&amp;rsquo;ve always loved about video games is the flexibility with which we can enjoy them. The older of us may remember going to arcades and popping quarters to enjoy a bit of cheap fun. Gaming has (obviously) exploded since then, to the point where we can now form communities on the internet around enjoying games without even playing them. It&amp;rsquo;s even gone full-circle. Arcades seem to be making a bit of a resurgence in my area, with some tweaks to the classic business model. But one big downside to the modernization of gaming is that we can start to lose elements that defined older games.&lt;/p&gt;&#xA;&lt;p&gt;What I mean is, as we phase out older technology in favor of newer tech, we lose the details that the older tech held. Older tech may have been janky, but it was great until improvements came around, and their jankiness defined how people enjoyed them. The only way to experience exactly what that was like back in the day would be to actually be back in the day with no knowledge of the future&amp;hellip; but since that&amp;rsquo;s impossible, it can be fun to aim to get as close as possible.&lt;/p&gt;&#xA;&lt;p&gt;One obvious example of the gap between old and new is display tech. This topic has sorta been beaten to death in the last couple of years, and I&amp;rsquo;m glad it has because that&amp;rsquo;s how I learned about it. Consoles from the &amp;rsquo;80s and &amp;rsquo;90s (and for a little bit beyond) were typically played on CRT televisions, which had certain visual qualities. These qualities were often taken into account when the games were being designed. The most well-known example of this is that NES developers knew that despite internally using &amp;ldquo;square&amp;rdquo; tiles, their games&amp;rsquo; video output would be stretched out a little bit horizontally, so sometimes the graphics were intentionally created a bit narrow to account for this. Check out the intro sequence from Kirby&amp;rsquo;s Adventure; Kirby is supposed to be spherical, so the first image doesn&amp;rsquo;t make sense.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;Kirby’s Adventure intro screen at an incorrect ratio&#34; class=&#34;gallery-image&#34; data-flex-basis=&#34;320px&#34; data-flex-grow=&#34;133&#34; height=&#34;1080&#34; loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://patchsalts.com/post/retro-shaders-are-important/kirby-narrow.png&#34; srcset=&#34;https://patchsalts.com/post/retro-shaders-are-important/kirby-narrow_hu_912c705c3b3ce148.png 800w, https://patchsalts.com/post/retro-shaders-are-important/kirby-narrow.png 1440w&#34; width=&#34;1440&#34;&gt;&#xA;&lt;img alt=&#34;The same screen, stretched to the right ratio :D&#34; class=&#34;gallery-image&#34; data-flex-basis=&#34;320px&#34; data-flex-grow=&#34;133&#34; height=&#34;1080&#34; loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://patchsalts.com/post/retro-shaders-are-important/kirby-wide.png&#34; srcset=&#34;https://patchsalts.com/post/retro-shaders-are-important/kirby-wide_hu_fdbbfe5d7c7340ef.png 800w, https://patchsalts.com/post/retro-shaders-are-important/kirby-wide.png 1440w&#34; width=&#34;1440&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;This concept is famous enough that most retro game re-releases include aspect ratio correction to replicate this effect, which is fantastic to see.&lt;/p&gt;&#xA;&lt;p&gt;But a slightly lesser-known artistic concept is dithering and blending. Game designers knew that when the console pushed the analog video signal to the CRT screen, the pixels would blend and smear a bit. This inevitability seems terrible at first glance, but limitations are often the cause of artistic innovation. Artists realized that even though the console might not have supported semi-transparency, they could take advantage of the blending to create the desired effect anyway. Sonic the Hedgehog has many examples of checkerboard or stripe patters (called dithering) throughout the game, which blur together and render as semi-transparency.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;Sonic the Hedgehog with a shield activated&#34; class=&#34;gallery-image&#34; data-flex-basis=&#34;320px&#34; data-flex-grow=&#34;133&#34; height=&#34;1080&#34; loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://patchsalts.com/post/retro-shaders-are-important/sonic-pixel.png&#34; srcset=&#34;https://patchsalts.com/post/retro-shaders-are-important/sonic-pixel_hu_5fefb549d379d8cd.png 800w, https://patchsalts.com/post/retro-shaders-are-important/sonic-pixel.png 1440w&#34; width=&#34;1440&#34;&gt;&#xA;&lt;img alt=&#34;The same screen, with a blending filter :D&#34; class=&#34;gallery-image&#34; data-flex-basis=&#34;320px&#34; data-flex-grow=&#34;133&#34; height=&#34;1080&#34; loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://patchsalts.com/post/retro-shaders-are-important/sonic-ntsc-crt.png&#34; srcset=&#34;https://patchsalts.com/post/retro-shaders-are-important/sonic-ntsc-crt_hu_a1dfdea925119a98.png 800w, https://patchsalts.com/post/retro-shaders-are-important/sonic-ntsc-crt.png 1440w&#34; width=&#34;1440&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;These screenshots are both taken from an emulator on a modern computer, but the second picture has a digital filter over it (or &amp;ldquo;shader&amp;rdquo; as they&amp;rsquo;re often called) that attempts to replicate the analog video signal and the CRT display. If you pay close attention, you can see that the shield over Sonic looks a lot more bubble-like and see-through. A bonus is that some of the background elements in the first image look chunky, but they&amp;rsquo;re rounded out quite a bit in the second image.&lt;/p&gt;&#xA;&lt;p&gt;As emulation took off in the 2000s, many young gamers took it as an opportunity to play games they couldn&amp;rsquo;t quite catch when they were popular. But without shaders recreating the intended look of the games, they missed out on a big part of the experience of what playing the game is supposed to be like. Filters are almost never enabled on emulators by default, and quite often the ones with advanced effects are computationally demanding, so the internet became flooded with screenshots from old games that don&amp;rsquo;t look at all like how they actually looked on the original console.&lt;/p&gt;&#xA;&lt;p&gt;Times are changing though. With more people able to access computers with higher specs, the use of these shaders is growing in popularity.&lt;/p&gt;&#xA;&lt;h1 id=&#34;porting-shaders-to-mgba&#34;&gt;&lt;a href=&#34;#porting-shaders-to-mgba&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;Porting shaders to mGBA&#xA;&lt;/h1&gt;&lt;p&gt;With that all said and done, the thing I&amp;rsquo;ve been working on is simply porting a few of my favorite shaders to mGBA, a Game Boy series emulator. So far I&amp;rsquo;ve only finished Sharp-Shimmerless&amp;hellip; it&amp;rsquo;s a simpler shader that doesn&amp;rsquo;t do nearly as much as analog signal and CRT simulation, but it still has a desirable effect. It&amp;rsquo;s more intended for games that were displayed on digital screens, but it doesn&amp;rsquo;t really matter what you use it on. It&amp;rsquo;s basically designed to be a middle-ground between (bi-)linear filtering and nearest-neighbor filtering. Take a look at these mock-ups I threw together in an image editor.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;A 2x2 checkerboard&#34; class=&#34;gallery-image&#34; data-flex-basis=&#34;240px&#34; data-flex-grow=&#34;100&#34; height=&#34;200&#34; loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://patchsalts.com/post/retro-shaders-are-important/demo-2.png&#34; width=&#34;200&#34;&gt;&#xA;&lt;img alt=&#34;Nearest neighbor&#34; class=&#34;gallery-image&#34; data-flex-basis=&#34;240px&#34; data-flex-grow=&#34;100&#34; height=&#34;200&#34; loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://patchsalts.com/post/retro-shaders-are-important/demo-5-nn.png&#34; width=&#34;200&#34;&gt;&#xA;&lt;img alt=&#34;Linear(-ish)&#34; class=&#34;gallery-image&#34; data-flex-basis=&#34;240px&#34; data-flex-grow=&#34;100&#34; height=&#34;200&#34; loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://patchsalts.com/post/retro-shaders-are-important/demo-5-linear.png&#34; width=&#34;200&#34;&gt;&#xA;&lt;img alt=&#34;Sharp-Shimmerless-ish&#34; class=&#34;gallery-image&#34; data-flex-basis=&#34;240px&#34; data-flex-grow=&#34;100&#34; height=&#34;200&#34; loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://patchsalts.com/post/retro-shaders-are-important/demo-5-px.png&#34; width=&#34;200&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;There may be some rough coloration errors, since I couldn&amp;rsquo;t simply run the source image through the desired filters, but this should be sufficient to get my point across. Here, I&amp;rsquo;ve upscaled a 2×2 checkerboard pattern to be 5×5. &amp;ldquo;Nearest neighbor&amp;rdquo; filtering simply chooses to replicate the closest input pixel, but this can leave weird issues at non-integer ratios (like this 2.5×) where some rows/columns appear wider than others, which can cause shimmering issues when the input image scrolls across the screen. &amp;ldquo;Linear(-ish)&amp;rdquo; filtering attempts to blend between the input pixels, but it can cause a blurry look. &amp;ldquo;Sharp-Shimmerless&amp;rdquo; attempts to mix the 2, where it only blends input pixels when the output pixel straddles a border between input pixels.&lt;/p&gt;&#xA;&lt;p&gt;This is absolutely a matter of preference, but when it comes to games for LCD screens, I prefer something like Sharp-Shimmerless to preserve the intended blockiness while also avoiding the shimmer, since I can sometimes notice the unevenness at a distance, taking me out of the game a little bit. Here&amp;rsquo;s an example from Mario Kart: Super Circuit for the Game Boy Advance. You may have to zoom in to see the difference. It&amp;rsquo;s not much, but it is there.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;Nearest neighbor&#34; class=&#34;gallery-image&#34; data-flex-basis=&#34;240px&#34; data-flex-grow=&#34;100&#34; height=&#34;270&#34; loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://patchsalts.com/post/retro-shaders-are-important/mario-kart-nn.png&#34; width=&#34;270&#34;&gt;&#xA;&lt;img alt=&#34;Bilinear&#34; class=&#34;gallery-image&#34; data-flex-basis=&#34;240px&#34; data-flex-grow=&#34;100&#34; height=&#34;270&#34; loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://patchsalts.com/post/retro-shaders-are-important/mario-kart-bilinear.png&#34; width=&#34;270&#34;&gt;&#xA;&lt;img alt=&#34;Sharp-Shimmerless&#34; class=&#34;gallery-image&#34; data-flex-basis=&#34;240px&#34; data-flex-grow=&#34;100&#34; height=&#34;270&#34; loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://patchsalts.com/post/retro-shaders-are-important/mario-kart-px.png&#34; width=&#34;270&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;An extreme example from the same game’s title screen&#34; class=&#34;gallery-image&#34; data-flex-basis=&#34;504px&#34; data-flex-grow=&#34;210&#34; height=&#34;800&#34; loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://patchsalts.com/post/retro-shaders-are-important/ewww-chunky.png&#34; srcset=&#34;https://patchsalts.com/post/retro-shaders-are-important/ewww-chunky_hu_d0f4262f6d5d251.png 800w, https://patchsalts.com/post/retro-shaders-are-important/ewww-chunky_hu_6b7ec765b4f28e5a.png 1600w, https://patchsalts.com/post/retro-shaders-are-important/ewww-chunky.png 1680w&#34; width=&#34;1680&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Sharp-Shimmerless wasn&amp;rsquo;t available for mGBA, so I decided to learn a bit and port it from libretro&amp;rsquo;s slang shader format to mGBA&amp;rsquo;s format. It was both very easy and very difficult. I&amp;rsquo;ve never had to give serious thought when handling shaders before, so there was a lot to figure out, since the files aren&amp;rsquo;t directly compatible. Maybe I&amp;rsquo;m missing something, but I couldn&amp;rsquo;t find direct answers to questions that arose during development (this is becoming a common theme around here).&lt;/p&gt;&#xA;&lt;p&gt;I ended up finding most of my answers in other shaders that were available in both mGBA and libretro, or the mGBA source code, digging in to find keywords used in the files, and then snooping around to find related keywords and resources. I struggled to understand some parts of it, so I also ended up making a sort of mockup in Google Sheets to figure out the internal workings of the shader.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;My spreadsheet that simulates inputs and outputs of the libretro version of Sharp-Shimmerless… Hey wait I should make a generic version of this to simulate more shaders… Oh no…&#34; class=&#34;gallery-image&#34; data-flex-basis=&#34;294px&#34; data-flex-grow=&#34;122&#34; height=&#34;904&#34; loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://patchsalts.com/post/retro-shaders-are-important/shader-simulator.png&#34; srcset=&#34;https://patchsalts.com/post/retro-shaders-are-important/shader-simulator_hu_6f5d11dad11dabc6.png 800w, https://patchsalts.com/post/retro-shaders-are-important/shader-simulator.png 1108w&#34; width=&#34;1108&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;&amp;hellip; It turned out that the language between the 2 formats is almost identical, and a lot of my problems were simply caused by trying to use a variable that didn&amp;rsquo;t exist. The latest version of mGBA is v0.10.5, but &lt;code&gt;outputSize&lt;/code&gt; wasn&amp;rsquo;t available in that version. Simply switching to a development build fixed almost all my problems. I wasted a lot of time figuring that out. Oh my. &amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;I posted the &lt;a class=&#34;link&#34; href=&#34;https://github.com/PatchSalts/mgba-sharp-shimmerless-shader&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;code up on my GitHub&lt;/a&gt; if you wanna check it out.&lt;/p&gt;&#xA;&lt;p&gt;Thank you so much for reading, have a nice day.&lt;/p&gt;&#xA;&lt;p&gt;– Patch&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>Introducing Desktop Scrollery</title>
            <link>https://patchsalts.com/post/introducing-desktop-scrollery/</link>
            <pubDate>Tue, 15 Sep 2026 14:21:40 -0400</pubDate>
            <guid>https://patchsalts.com/post/introducing-desktop-scrollery/</guid>
            <description>&lt;img src=&#34;https://patchsalts.com/post/introducing-desktop-scrollery/kwin-scripts.png&#34; alt=&#34;Featured image of post Introducing Desktop Scrollery&#34; /&gt;&lt;p&gt;Hello again! Today I&amp;rsquo;d like to introduce Desktop Scrollery. You can scatter papers all over a physical desktop and shift your gaze to whichever one you want to read. You can try to do this on a computer&amp;rsquo;s virtual desktop, but you&amp;rsquo;ll find it&amp;rsquo;s rather easy to run out of space. Your screen is usually not big enough. I&amp;rsquo;ve always thought it might be fun to try and complete the skeuomorphism. I&amp;rsquo;m building a tool that allows you to scroll your windows across your computer&amp;rsquo;s virtual desktop space to give the sense of moving spatially between windows rather than constantly alt-tabbing to raise windows over currently visible ones. Please note that I&amp;rsquo;m developing it as a KWin script, meaning it&amp;rsquo;s only available for KDE Plasma users (so as far as I know, no Mac/Windows support, sorry). Currently, the plan is to slide windows over when your mouse cursor touches the edges of the screen. Here&amp;rsquo;s a demo of the current functionality.&lt;/p&gt;&#xA;&lt;div class=&#34;video-wrapper&#34;&gt;&#xA;    &lt;video&#xA;        controls&#xA;        src=&#34;demo.webm&#34;&#xA;        &#xA;        &#xA;        &#xA;    &gt;&#xA;        &lt;p&gt;&#xA;            Your browser doesn&#39;t support HTML5 video. Here is a&#xA;            &lt;a href=&#34;demo.webm&#34;&gt;link to the video&lt;/a&gt; instead.&#xA;        &lt;/p&gt;&#xA;    &lt;/video&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;&amp;hellip; As you may be able to see, it&amp;rsquo;s kinda iffy right now. The windows are supposed to slide over in both axes, not resize only vertically. I&amp;rsquo;m not comfortable putting it in the main branch yet, so to test drive it yourself you&amp;rsquo;d have to use the &lt;code&gt;basic-functionality&lt;/code&gt; branch. You can check it out on the &lt;a class=&#34;link&#34; href=&#34;https://github.com/PatchSalts/desktop-scrollery&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;GitHub repository&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h1 id=&#34;a-little-history-on-the-development-process&#34;&gt;&lt;a href=&#34;#a-little-history-on-the-development-process&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;A little history on the development process&#xA;&lt;/h1&gt;&lt;p&gt;This is an idea I&amp;rsquo;ve had for a very long time. I&amp;rsquo;ve even tried to implement it before, but I ran into some issues between the gap in the documentation and my current knowledge on the subject.&lt;/p&gt;&#xA;&lt;p&gt;There are some documentation pages for KWin scripting available, but every time I read them I feel like I&amp;rsquo;m missing something. For example, there&amp;rsquo;s an &lt;a class=&#34;link&#34; href=&#34;https://develop.kde.org/docs/plasma/kwin&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;official &amp;ldquo;KWin scripting tutorial&amp;rdquo; page&lt;/a&gt;, and it provides plenty of useful info, but also omits plenty of crucial info. It describes how a KWin script project is packaged using the KPackage format, but it doesn&amp;rsquo;t actually describe how to package your script, and the &lt;a class=&#34;link&#34; href=&#34;https://api.kde.org/kpackage-index.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;KPackage link they provide&lt;/a&gt; doesn&amp;rsquo;t explain either, instead seeming to cover building KPackage save/load support into full-blown desktop programs. My confusion every time I opened the docs is a huge reason the project has never made it out of the ideation phase before.&lt;/p&gt;&#xA;&lt;p&gt;This time I decided to just get something done, no matter what it takes me to do it. I went in search of some external examples and resources, and I found an example script to inspire me, &lt;a class=&#34;link&#34; href=&#34;https://github.com/Flupp/sticky-window-snapping&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Sticky Window Snapping by FLUPP&lt;/a&gt;. It&amp;rsquo;s really easy to follow along if I see how someone else did it. It turns out the package format is really just zipping your project and changing the extension from &lt;code&gt;.zip&lt;/code&gt; to &lt;code&gt;.kwinscript&lt;/code&gt;. Unbelievable&amp;hellip; Brilliant&amp;hellip; Look, I understand that this kind of information is probably in the docs somewhere, but when the page is titled &amp;ldquo;KWin scripting tutorial&amp;rdquo; I feel like including that information directly on the page would be pretty helpful. Perhaps I should figure out how to contribute to the page just to fix it so the project benefits from my confusion.&lt;/p&gt;&#xA;&lt;p&gt;Being a sore loser aside, I have been able to test that my project is somewhat functional, so that&amp;rsquo;s pretty neat. I&amp;rsquo;m finding myself dreading opening it to continue working on it&amp;hellip; This is the furthest I&amp;rsquo;ve ever gotten with the project, so I think I&amp;rsquo;m gonna take a rest on it for now and switch to a different project before I burn out too much.&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h1 id=&#34;personal-stuff-since-my-last-post&#34;&gt;&lt;a href=&#34;#personal-stuff-since-my-last-post&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;Personal stuff since my last post&#xA;&lt;/h1&gt;&lt;p&gt;Touhou 6&amp;rsquo;s remaster and rebuild being available on Steam has been a total blast, I didn&amp;rsquo;t quite realize how much I missed playing these games. For the unaware (most of my audience haha), the Touhou Project is a series of Japanese bullet hell games that draw heavy inspiration from classic arcade shooters like Galaga, 1942, DoDonPachi, etc. The player dodges waves of enemy fire while progressing through the (cheesy) plot. Completing a full playthrough only takes around 30 minutes. They&amp;rsquo;re difficult, but the difficulty is secondary to the weird and classic vibes. I&amp;rsquo;m really grateful for a way to easily run the game again, it&amp;rsquo;s a bit tricky to get the old version running nicely on modern computer systems.&lt;/p&gt;&#xA;&lt;p&gt;I watched Coyote vs. ACME last weekend with some friends, it was a blast. I didn&amp;rsquo;t really grow up watching much Looney Tunes, but I had a basic level of familiarity. There were several jokes that I didn&amp;rsquo;t really understand but they were few and far between. The basic pacing of the humor was extremely pleasant and engaging.&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;m excited for the new changes being brought into Overwatch soon, Doctrine looks like a super fun character and I&amp;rsquo;m excited for the day he&amp;rsquo;ll be added to the game in full.&lt;/p&gt;&#xA;&lt;p&gt;Apparently I&amp;rsquo;m super susceptible to pressure fluctuations. I was feeling totally crummy yesterday, waking up with a headache and fatigue, which stayed with me all day. Checking the air quality monitor revealed that from the 19th to the 21st, the air pressure went from 1011 hPa to 1001 hPa and back up to 1011 hPa. Yippee. I guess it&amp;rsquo;s a relief to know that something did this to me rather than some sort of mysterious wind.&lt;/p&gt;&#xA;&lt;p&gt;Thank you so much for reading, have a nice day.&lt;/p&gt;&#xA;&lt;p&gt;&amp;ndash; Patch&lt;/p&gt;&#xA;</description>
        </item></channel>
</rss>
