{"id":50728,"date":"2025-01-05T14:33:07","date_gmt":"2025-01-05T14:33:07","guid":{"rendered":"https:\/\/www.libretro.com\/?p=50728"},"modified":"2025-01-05T14:46:39","modified_gmt":"2025-01-05T14:46:39","slug":"retroarch-first-program-to-support-blurbusters-crt-beam-racing-simulator-shader","status":"publish","type":"post","link":"https:\/\/www.libretro.com\/index.php\/retroarch-first-program-to-support-blurbusters-crt-beam-racing-simulator-shader\/","title":{"rendered":"RetroArch first program to support BlurBuster&#8217;s CRT beam racing simulator shader"},"content":{"rendered":"\n<p>We are excited to introduce a new shader that significantly improves motion clarity on modern displays, without the typical drawbacks associated with black-frame insertion (BFI) implementations. This shader is the work of Mark Rejhon from BlurBusters (<a href=\"http:\/\/blurbusters.com\" data-type=\"URL\" data-id=\"blurbusters.com\">blurbusters.com<\/a>) and Timothy Lottes (creator of the original FXAA shader and the crt-lottes shaders). It leverages RetroArch&#8217;s recently added &#8220;subframe&#8221; shader capabilities, enabling it to operate at multiples of the standard content framerate.<\/p>\n\n\n\n<p>NOTE: Make sure you use RetroArch 1.20.0 or a more recent version (any nightly will do). Previous versions do not support the Shader Sub-frames feature that this shader relies on.<\/p>\n\n\n\n<p><strong>Acronyms used:<\/strong> BFI (Black-Frame insertion), FXAA (Fast Approximate Anti Aliasing)<\/p>\n\n\n\n<p>The original Shadertoy implementation can be found here: <a href=\"http:\/\/www.shadertoy.com\/view\/XfKfWd\">www.shadertoy.com\/view\/XfKfWd<\/a>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/www.libretro.com\/wp-content\/uploads\/2025\/01\/subframes-1-scaled.jpg\"><img decoding=\"async\" loading=\"lazy\" width=\"1024\" height=\"576\" src=\"https:\/\/www.libretro.com\/wp-content\/uploads\/2025\/01\/subframes-1-1024x576.jpg\" alt=\"\" class=\"wp-image-50730\" srcset=\"https:\/\/www.libretro.com\/wp-content\/uploads\/2025\/01\/subframes-1-1024x576.jpg 1024w, https:\/\/www.libretro.com\/wp-content\/uploads\/2025\/01\/subframes-1-300x169.jpg 300w, https:\/\/www.libretro.com\/wp-content\/uploads\/2025\/01\/subframes-1-768x432.jpg 768w, https:\/\/www.libretro.com\/wp-content\/uploads\/2025\/01\/subframes-1-1536x864.jpg 1536w, https:\/\/www.libretro.com\/wp-content\/uploads\/2025\/01\/subframes-1-2048x1152.jpg 2048w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/www.libretro.com\/wp-content\/uploads\/2025\/01\/subframes-2-1-scaled.jpg\"><img decoding=\"async\" loading=\"lazy\" width=\"1024\" height=\"576\" src=\"https:\/\/www.libretro.com\/wp-content\/uploads\/2025\/01\/subframes-2-1-1024x576.jpg\" alt=\"\" class=\"wp-image-50732\" srcset=\"https:\/\/www.libretro.com\/wp-content\/uploads\/2025\/01\/subframes-2-1-1024x576.jpg 1024w, https:\/\/www.libretro.com\/wp-content\/uploads\/2025\/01\/subframes-2-1-300x169.jpg 300w, https:\/\/www.libretro.com\/wp-content\/uploads\/2025\/01\/subframes-2-1-768x432.jpg 768w, https:\/\/www.libretro.com\/wp-content\/uploads\/2025\/01\/subframes-2-1-1536x864.jpg 1536w, https:\/\/www.libretro.com\/wp-content\/uploads\/2025\/01\/subframes-2-1-2048x1152.jpg 2048w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>If you have a high-refresh-rate monitor (120 Hz or higher) and want to try it in RetroArch, follow these steps:<\/p>\n\n\n\n<ul>\n<li>Go to Settings &gt; Video &gt; Synchronization and enable the &#8220;Shader Sub-frames&#8221; option that matches your monitor\u2019s refresh rate.<\/li>\n\n\n\n<li>Do not adjust the &#8220;Rolling Scanline Simulation&#8221; option, as it is unrelated.<\/li>\n\n\n\n<li>Load your desired core and content, then open the quick menu. Scroll down to Shaders and select Load Preset.<\/li>\n\n\n\n<li>You can find the shader in the subframe-bfi directory, named &#8220;crt-beam-simulator.slangp.<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/www.libretro.com\/wp-content\/uploads\/2025\/01\/crt-beamracing-scaled.jpg\"><img decoding=\"async\" loading=\"lazy\" width=\"1024\" height=\"576\" src=\"https:\/\/www.libretro.com\/wp-content\/uploads\/2025\/01\/crt-beamracing-1024x576.jpg\" alt=\"\" class=\"wp-image-50734\" srcset=\"https:\/\/www.libretro.com\/wp-content\/uploads\/2025\/01\/crt-beamracing-1024x576.jpg 1024w, https:\/\/www.libretro.com\/wp-content\/uploads\/2025\/01\/crt-beamracing-300x169.jpg 300w, https:\/\/www.libretro.com\/wp-content\/uploads\/2025\/01\/crt-beamracing-768x432.jpg 768w, https:\/\/www.libretro.com\/wp-content\/uploads\/2025\/01\/crt-beamracing-1536x864.jpg 1536w, https:\/\/www.libretro.com\/wp-content\/uploads\/2025\/01\/crt-beamracing-2048x1152.jpg 2048w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>If you&#8217;d like to combine this shader with others (e.g., your favorite CRT shader), you can usually prepend it to other presets without issue.<\/p>\n\n\n\n<p>You can also select any of the pre-made presets that use the CRT beamracing shader. You can find these under shaders_slang\/presets\/crt-beam-simulator.<\/p>\n\n\n\n<p>Once it&#8217;s up and running, the shader will need some tuning based on your specific display. It includes runtime parameters that allow you to adjust the gamma to achieve a neutral image (i.e., eliminating any unusual dark lines) and fine-tune the trade-off between brightness and motion clarity. For 120 Hz monitors (2 subframes), a value of ~0.5 works well, while ~0.7 is ideal for 240 Hz monitors (4 subframes).<\/p>\n\n\n\n<p>Some of the key advantages of this shader over conventional BFI include:<\/p>\n\n\n\n<ul>\n<li>Less flicker: The shader is much smoother and more forgiving of occasional frame drops.<\/li>\n\n\n\n<li>Works with arbitrary refresh rates: RetroArch\u2019s subframe feature is limited to integer values, but the shader automatically adjusts to match your subframe setting.<\/li>\n\n\n\n<li>Prevents image persistence: It includes a small offset to cycle timing to prevent image persistence (often mistakenly called &#8220;burn-in&#8221;) on common IPS LCD panels. This issue is not permanent, like CRT burn-in, but can still be concerning.<\/li>\n<\/ul>\n\n\n\n<p>Not all flat-panel monitors are at risk of image persistence, which is caused by voltage accumulation in the panel caused by the on\/off flickering. OLED panels, for example, are unaffected, as are monitors running at odd integer multiples of 60 Hz, such as 180 Hz. If you&#8217;re using one of these displays, we&#8217;ve included a runtime parameter to disable the cycle timing offset, which stops the simulated raster line from rolling up the screen. There is also a parameter to adjust the position of the raster line, so you can place it in the least obtrusive spot for your setup.<\/p>\n\n\n\n<p>If you encounter any issues with the shader, Mr. Rejhon has an FAQ and troubleshooting guide available on his GitHub repository: <a href=\"https:\/\/github.com\/blurbusters\/crt-beam-simulator\/issues\/4\">https:\/\/github.com\/blurbusters\/crt-beam-simulator\/issues\/4<\/a>. You can also seek help through our usual support channels (Discord, Reddit, or the Libretro forums).<\/p>\n\n\n\n<p>See also this <a href=\"https:\/\/www.youtube.com\/watch?v=PmXmr4Yiz_0\">video<\/a> from a person quite knowledgeable in display technologies.<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"CRT simulation is ready to be seen on 120Hz+ OLEDs using RetroArch CRT beam simulator slang.\" width=\"750\" height=\"422\" src=\"https:\/\/www.youtube.com\/embed\/PmXmr4Yiz_0?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>We are excited to introduce a new shader that significantly improves motion clarity on modern displays, without the typical drawbacks associated with black-frame insertion (BFI) implementations. This shader is the work of Mark Rejhon from BlurBusters (blurbusters.com) and Timothy Lottes (creator of the original FXAA shader and the crt-lottes shaders). It leverages RetroArch&#8217;s recently added [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":true,"template":"","format":"standard","meta":[],"categories":[28],"tags":[409,56],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.libretro.com\/index.php\/wp-json\/wp\/v2\/posts\/50728"}],"collection":[{"href":"https:\/\/www.libretro.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.libretro.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.libretro.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.libretro.com\/index.php\/wp-json\/wp\/v2\/comments?post=50728"}],"version-history":[{"count":7,"href":"https:\/\/www.libretro.com\/index.php\/wp-json\/wp\/v2\/posts\/50728\/revisions"}],"predecessor-version":[{"id":50740,"href":"https:\/\/www.libretro.com\/index.php\/wp-json\/wp\/v2\/posts\/50728\/revisions\/50740"}],"wp:attachment":[{"href":"https:\/\/www.libretro.com\/index.php\/wp-json\/wp\/v2\/media?parent=50728"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.libretro.com\/index.php\/wp-json\/wp\/v2\/categories?post=50728"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.libretro.com\/index.php\/wp-json\/wp\/v2\/tags?post=50728"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}