<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Emulators on PatchSalts.com</title>
        <link>https://patchsalts.com/tags/emulators/</link>
        <description>Recent content in Emulators 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/tags/emulators/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></channel>
</rss>
