Home » The SNES Can Do Ray Tracing Thanks to a Homebrew “SuperRT” Chip
The SNES Can Do Ray Tracing Thanks to a Homebrew “SuperRT” Chip
Ray tracing isn’t a new graphics term. It’s been around for ages, and if you’ve ever seen old demos of reflective orbs and teapots from the ’90s, those were probably ray tracing showcases. The reason it’s a big dealtoday is that modern graphics cards and new consoles can finally start doing ray traced lighting and effects in games in real time. Big deal, though; you can also get ray tracing going on a Super Nintendo.
That’s what engineer Ben Carter’s achieved with “SuperRT,” his homebrew ray tracing add-on conceived for the SNES (actually, he’s running his off a Super Famicom, but it’s all the same). Riffing off the idea of the Super FX, the processors included inside the cartridges for games like Star Fox and Yoshi’s Island, Carter’s chip design interfaces with the SNES in the same way.
The “SuperRT” has three execution cores that run at 50Mhz for handling the ray tracing. Both it and its demo scene are purpose-built, as the chip can only render certain primitive shapes like spheres and cubes (it doesn’t rasterize objects i.e. render them as polygons as typical 3D games do). Carter designed his chip in the spirit of the Super FX, meaning this isn’t a ray tracing demo being handled on other hardware that’s then merely passed through the SNES.
“This isn’t a case where there’s a PC or ARM [System On a Chip] running everything behind the scenes,” Carter explains in a supplementary tech walkthrough video. “The SNES is firmly in the driving seat here, with the SuperRT only handling ray tracing duties, image data conversion, and providing some extra maths functions.”
You can see the demo chug a bit at points, but the chip can push a 200 by 160 pixel ray traced scene at 30 frames per second in ideal conditions. That’s really impressive for a 1990 console, especially when you consider that Carter’s working prototype is also a large rat’s nest of wires poking out of breadboards.
It’d be neat to see someone with FPGA production know-how make a production-ready version of Carter’s chip that can be put in a cartridge (I’m looking at you, Analog ). Cooler still would be something like a ray traced version of a polygonal game like Star Fox; all basic shapes and planes still, but with dynamic lighting from the sun and reflections galore. Demos full of cubes are nice and all, but just imagine seeing the Arwing reflected in Andross’s ugly mug.
Thanks, Digital Foundry.
');
jQuery('.video-container', yt_video_wrapper).remove();
jQuery('.bb_wrapper', yt_video_wrapper).append('Watch on YouTube ');
});
});
}
function runComscore() {
var _comscore = _comscore || [];
_comscore.push({ c1: "2", c2: "8518622" });
(function() {
var s = document.createElement("script");
el = document.getElementsByTagName("script")[0];
s.async = true;
s.src = "https://sb.scorecardresearch.com/beacon.js";
el.parentNode.insertBefore(s, el);
})();
}
function runFacebookLogin() {
$(document).ready(function() {
fbs = $("[data-action=facebook-login]");
for(i = 0; i < fbs.length; i++) {
new FacebookLogin({
target: fbs[i]
});
}
});
}
function triggerMormont () {
mormont('set', 'section', 'article');
mormont('set', 'language', 'en');
mormont('set', 'platforms', ['snes']);
mormont('set', 'published', "2020-12-15T21:40:00+00:00");
mormont('set', 'article_type', "news");
mormont('set', 'author', "Mathew Olson");
mormont('set', 'tags', ['tag:nintendo','tag:retro'])
mormont('set', 'medium', 'web');
mormont('set', 'is_logged_in', "0");
mormont('send', 'pageview');
mormont('trackClicks', ['article']);
}
function runMormont() {
var s = document.createElement('script');
s.type="text/javascript";
s.async = true;
s.onload = function() { triggerMormont() };
s.src="https://cdn.gamer-network.net/2019/mormont/v2.25.0/mormont.js";
document.getElementsByTagName('head')[0].appendChild(s);
}
function runRecaptcha() {
var s = document.createElement('script');
s.type="text/javascript";
s.async = true;
s.src="https://www.google.com/recaptcha/api.js";
document.getElementsByTagName('head')[0].appendChild(s);
}
function runSkimlinks() {
var s = document.createElement('script');
s.type="text/javascript";
s.async = true;
s.src="https://s.skimresources.com/js/87431X1540266.skimlinks.js";
document.getElementsByTagName('head')[0].appendChild(s);
}
function runSourcepoint() {
var _sp_=function(n){function t(e){if(o[e])return o[e].exports;var r=o[e]={i:e,l:!1,exports:{}};return n[e].call(r.exports,r,r.exports,t),r.l=!0,r.exports}var o={};return t.m=n,t.c=o,t.i=function(n){return n},t.d=function(n,o,e){t.o(n,o)||Object.defineProperty(n,o,{configurable:!1,enumerable:!0,get:e})},t.n=function(n){var o=n&&n.__esModule?function(){return n["default"]}:function(){return n};return t.d(o,"a",o),o},t.o=function(n,t){return Object.prototype.hasOwnProperty.call(n,t)},t.p="",t(t.s=2)}([function(n,t){function o(n,t){e&&console[n].apply(console,["[bootstrap]"].concat(Array.prototype.slice.call(t)))}var e=!1;n.exports={debug:function(){o("debug",arguments)},info:function(){o("info",arguments)},time:function(){o("time",arguments)},warn:function(){o("warn",arguments)},error:function(){o("error",arguments)},useDefaults:function(){e=!0},DEBUG:1}},function(n,t,o){"use strict";function e(){D||(D=!0,z=h.config=h.config||{},u(),N=z.bootstrap&&z.bootstrap.contentControlCallback||z.content_control_callback,B=z.accountId||z.account_id||z.client_id||window.sp_cid,G=z.beacon&&z.beacon.contentControlEndpoint||z.content_control_beacon_endpoint||v.a,z.debug_level&&"OFF"!==z.debug_level.toString().toUpperCase()||z.debug&&z.debug.level&&"OFF"!==z.debug.level.toString().toUpperCase()?F=!0:window.location.search&&null!=window.location.search.match(/_sp_debug_level=(?!off|OFF)/)&&(F=!0),F&&m.useDefaults({defaultLevel:m.DEBUG}))}function r(n,t,e){function r(o,e){var r=new Image;r.src="https://"+G+"/cct?v="+encodeURIComponent(v.b)+"&ct="+_+"&cid="+encodeURIComponent(B)+"&l="+encodeURIComponent(n.toString())+"&rc="+encodeURIComponent(t)+"&d0="+encodeURIComponent(i)+(o?"&d1="+encodeURIComponent(o):"")+(null==e?"":"&d2="+encodeURIComponent(e)),g.info("sending beacon: "+r.src),c&&c()}var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"",a=arguments[4],c=arguments[5];if(a){var d=e.lastIndexOf("."),s=e.lastIndexOf("https://www.usgamer.net/"),u=-1===d||s>d?e+".png":e.substring(0,d)+".png",l=new Image;l.addEventListener("load",function(){r("1",u)}),l.addEventListener("error",function(){o.i(f.a)(u,function(n,t,o){r("0",u+"::"+o)})}),l.src=u}else r()}function i(n,t,o,e){var r=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},a=arguments.length>5&&void 0!==arguments[5]&&arguments[5],c=function(){i(n,t,o,e,r,!0)};n(t,a?o:c,e,r)}function a(n,t,o,e){function r(o,r){t(o,n,r,e.enableImageLoad)}function i(t,r){o(t,n,r,e.enableImageLoad),e.onError&&e.onError(r)}var a=document.createElement("script");a.src=n,a.onload=function(){e.onLoad&&e.onLoad()},a.onerror=function(){function t(n){return o.indexOf(n)>-1}var o=(navigator.userAgent||navigator.vendor||window.opera).toLowerCase();t("mobi")||t("ipad")||t("android")||t("iphone")?i(x):t("exabot")?i(U):t("bingbot")||t("bingpreview")?i(S):t("googlebot")||t("adsbot-google")||t("mediapartners-google")?i(E):t("googleweblight")?i(O):window.location.host===w?i(I):window.location.host.indexOf(b)>-1?i(j):t("msie 10")||t("msie 9")||t("msie 8")?i(k):c(n,r,i)},document.head.appendChild(a),document.querySelector('script[src="'+n+'"]')||-1!==window.location.host.indexOf(b)||(g.info("Script not present"),r(C,n))}function c(n,t,e){o.i(f.a)(n,function(o,r,i,a){(o||r?t:e)(a,n+"::"+i)})}function d(n,t,o,e){if(q)return void s(R+"::"+n,o);r(L,n,t,o,e,function(){if(N){if(F){g.error("bootstrap locking",L,n,t,o,e);debugger}setTimeout(function(){N()},250)}})}function s(n,t,o,e){r(y,n,t,o,e)}function u(){h._networkListenerData||(h._networkListenerData=o.i(p.a)())}function l(n,t){e(),g.info("bootstrap called with",n,t),i(a,n,d,s,t)}Object.defineProperty(t,"__esModule",{value:!0});var f=o(4),p=o(5),v=o(3),g=o(0),m=void 0;m=o(0);var w=["w","e","b","c","a","c","h","e",".","g","o","o","g","l","e","u","s","e","r","c","o","n","t","e","n","t",".","c","o","m"].join(""),b=["o","p","t","i","m","i","z","e","l","y","p","r","e","v","i","e","w",".","c","o","m"].join(""),h=window._sp_||{},_=1,y=0,L=1,C="s",x="m",E="g",I="gw",O="gl",k="i",S="b",U="e",R="n",j="o",D=!1,q=!1,F=!1,z=void 0,N=void 0,B=void 0,G=void 0;window.addEventListener("beforeunload",function(){q=!0}),window._sp_=h,h.setupNetworkListeners=u,h.bootstrap=l,window.spBootstrap=l,t["default"]=h},function(n,t,o){o(0);n.exports=o(1)["default"]},function(n,t,o){"use strict";function e(n){return n.join("")}o.d(t,"b",function(){return r}),o.d(t,"a",function(){return i});var r=(o(0),"2.0.1056"),i=(e(["w","w","w",".","s","u","m","m","e","r","h","a","m","s","t","e","r",".","c","o","m"]),e(["w","w","w",".","r","o","o","s","t","e","r","f","i","r","e","w","o","r","k",".","c","o","m"]));e(["https://www.usgamer.net/","https://www.usgamer.net/","f","s","m","1","0","1","9",".","g","l","o","b","a","l",".","s","s","l",".","f","a","s","t","l","y",".","n","e","t","https://www.usgamer.net/","f","s","m","https://www.usgamer.net/","d","s"]),e(["h","t","t","p","s",":","https://www.usgamer.net/","https://www.usgamer.net/","d","2","z","v","5","r","k","i","i","4","6","m","i","q",".","c","l","o","u","d","f","r","o","n","t",".","n","e","t","https://www.usgamer.net/","0","https://www.usgamer.net/","2",".","0",".","1","0","5","6","https://www.usgamer.net/","r","e","c","o","v","e","r","y","_","d","f","p","_","i","n","t","e","r","n","a","l","-","v","2",".","0",".","1","0","5","6",".","j","s"]),e(["h","t","t","p","s",":","https://www.usgamer.net/","https://www.usgamer.net/","d","2","z","v","5","r","k","i","i","4","6","m","i","q",".","c","l","o","u","d","f","r","o","n","t",".","n","e","t","https://www.usgamer.net/","0","https://www.usgamer.net/","2",".","0",".","1","0","5","6","https://www.usgamer.net/","r","e","c","o","v","e","r","y","_","l","i","b","_","a","p","i","_","i","f","r","a","m","e","-","v","2",".","0",".","1","0","5","6",".","h","t","m","l"]),e(["h","t","t","p","s",":","https://www.usgamer.net/","https://www.usgamer.net/","d","2","z","v","5","r","k","i","i","4","6","m","i","q",".","c","l","o","u","d","f","r","o","n","t",".","n","e","t","https://www.usgamer.net/","0","https://www.usgamer.net/","2",".","0",".","1","0","5","6","https://www.usgamer.net/","r","e","c","o","v","e","r","y","_","l","i","b","_","r","i","d","_","i","f","r","a","m","e","-","v","2",".","0",".","1","0","5","6",".","h","t","m","l"])},function(n,t,o){"use strict";function e(n,t){function o(n){try{return n&&n.timeStamp?n.timeStamp:window.performance.now()}catch(n){return Date.now()}}var e=arguments.length>2&&void 0!==arguments[2]?arguments[2]:window.location,l=arguments.length>3&&void 0!==arguments[3]?arguments[3]:window.navigator,f=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},p=document.createElement("a");if(p.href=n,"https:"===e.protocol&&p.protocol!==e.protocol)return r.error("protocol mismatch in https environment, standing down"),void t(!1,!1,p.protocol,s);var v=new XMLHttpRequest,g=f.withCredentials;null!=g&&(v.withCredentials=g);try{v.open(f.method||"GET",n)}catch(n){return void t(!0,!1,n.toString(),c,v)}if(null!=f.headers){var m=f.headers;Object.keys(m).forEach(function(n){v.setRequestHeader(n,m[n])})}var w=void 0,b=void 0;v.onloadstart=function(n){w=o(n)},v.on
statechange=function(n){if(4===this.readyState){b=o(n)-w;var e=0===this.status&&!1!==l.onLine,r="2"===this.status.toString()[0],c=void 0;return c=r?a:!1===l.onLine?u:i,void t(e,r,this.status+"::"+b,c,v)}};try{v.send(f.body)}catch(n){return void t(!0,!1,n.toString(),d,v)}}t.a=e;var r=o(0),i="n",a="nx",c="xo",d="xs",s="p",u="of"},function(n,t,o){"use strict";function e(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:document,t=[],o=[],e=r.bind(null,t),i=r.bind(null,o);return n.addEventListener("load",e,!0),n.addEventListener("error",i,!0),{load:{events:t,listener:e},error:{events:o,listener:i}}}function r(n,t){if(t.target){var o="string"==typeof t.target.tagName?t.target.tagName.toLowerCase():"",e="string"==typeof t.target.src?t.target.src:"";"iframe"!==o&&n.push({tagName:o,src:e})}}t.a=e;o(0)}]);
//# sourceMappingURL=https://s3.amazonaws.com/d3jlsadfjkuern/2.0.1056/Ym9vdHN0cmFwLmpz.map
window ._sp_ = window ._sp_ || {};
window ._sp_.config = window ._sp_.config || {};
window ._sp_.config.account_id = 347;
window ._sp_.config.content_control_callback = function () {
//console.log( 'CONTENT LOCK' );
};
window ._sp_.config.mms_domain = 'usgamer-us.usgamer.net' ;
window ._sp_.mms = window ._sp_.mms || {};
window ._sp_.mms.cmd = window ._sp_.mms.cmd || [];
window ._sp_.config.mms_client_data_callback = function (o) {};
window._sp_.config.fsm_endpoint = "//usg-p2.usgamer.net";
window._sp_.config.enable_fsm_detection = true;
window._sp_.config.enable_fsm_network_detection = true;
window ._sp_.mms.cmd.push( function () {
window ._sp_.mms.setTargeting( "logged-in" , "false" );
window ._sp_.mms.setTargeting( "show-ads" , "true" );
});
window ._sp_.mms.cmd.push( function () {
window ._sp_.mms.startMsg();
});
window ._sp_.bootstrap( '/static/scripts/musgamer-fsm.js' );
window ._sp_.config.mms_choice_selected_callback = function (choiceID) {
};
window ._sp_.config.mms_client_data_callback = function (dataObject) {
};
}
function runFacebookPixel() {
!function(f,b,e,v,n,t,s){if(f.fbq)return;n=f.fbq=function(){n.callMethod?
n.callMethod.apply(n,arguments):n.queue.push(arguments)};if(!f._fbq)f._fbq=n;
n.push=n;n.loaded=!0;n.version='2.0';n.queue=[];t=b.createElement(e);t.async=!0;
t.src=v;s=b.getElementsByTagName(e)[0];s.parentNode.insertBefore(t,s)}(window,
document,'script','//connect.facebook.net/en_US/fbevents.js');
fbq('init', '686233492142124');
fbq('track', 'PageView');
}
const frames = window.frames;
for (let i = 0; i < frames.length; i++) {
frames[i].stop();
}
function sandboxIframes() {
const iframes = jQuery('iframe[src]');
jQuery.each(iframes, function() {
const iframe = jQuery(this);
// Youtube iframes are exempt from being sandboxed
// as long as we swap them for the Privacy Enhanced player
if(iframe.attr('src').match(/youtube(-nocookie)?.com/embed/i)) {
iframe.attr('src', iframe.attr('src').replace('youtube.com', 'youtube-nocookie.com'));
} else {
iframe.attr('data-src', iframe.attr('src'));
iframe.attr('alt', 'Please accept cookies to see this iframe.');
iframe.removeAttr('src');
}
});
}
function sandboxScripts() {
const scripts = jQuery('script[src]:not(.ignore-script)');
jQuery.each(scripts, function() {
const script = jQuery(this);
script.attr('type', 'text/plain');
script.attr('data-src', script.attr('src'));
script.removeAttr('src');
});
}
function runIframes() {
const iframes = jQuery('iframe[data-src]');
jQuery.each(iframes, function() {
const iframe = jQuery(this);
iframe.attr('src', iframe.attr('data-src'));
iframe.removeAttr('alt');
iframe.removeAttr('data-src');
});
}
function runScripts() {
const scripts = jQuery('script[data-src]:not(.ignore-script)');
jQuery.each(scripts, function() {
const script = jQuery(this);
script.attr('src', script.attr('data-src'));
script.attr('type', 'text/javascript');
script.removeAttr('alt');
script.removeAttr('data-src');
});
}
Source link