{"id":48019,"date":"2019-09-17T06:00:04","date_gmt":"2019-09-17T10:00:04","guid":{"rendered":"https:\/\/www.shamusyoung.com\/twentysidedtale\/?p=48019"},"modified":"2019-09-24T06:56:20","modified_gmt":"2019-09-24T10:56:20","slug":"this-dumb-industry-raytracing","status":"publish","type":"post","link":"https:\/\/www.shamusyoung.com\/twentysidedtale\/?p=48019","title":{"rendered":"This Dumb Industry: Raytracing"},"content":{"rendered":"<p>This article has a companion video. I try to make the article and the video roughly equal in usefulness, but like the old saying: <em>One second of footage is worth 60,000 words<\/em>. This video shows off some footage from Minecraft with a raytracing mod, and footage from <em><a href=\"?p=47984\">Control<\/a><\/em> with raytracing enabled. There&#8217;s something amazing about seeing shadows and reflections update in realtime, and static screenshots can&#8217;t really do it justice. As always, you can <a href=\"https:\/\/youtu.be\/lyfTPG-dwOE\">watch the video<\/a> or read on for the article&#8230;<\/p>\n<p><!--more--><\/p>\n<h3>Raytracing<\/h3>\n<p><table class='nomargin' cellspacing='0' width='100%' cellpadding='0' align='center' border='0'><tr><td><iframe loading=\"lazy\" width=\"1024\" height=\"576\" src=\"https:\/\/www.youtube.com\/embed\/lyfTPG-dwOE\" frameborder=\"0\" allowfullscreen class=\"embed\"><\/iframe><br\/><small><a href='http:\/\/www.youtube.com\/watch?v=lyfTPG-dwOE'>Link (YouTube)<\/a><\/small><\/td><\/tr><\/table><\/p>\n<p>Before we talk about raytracing, let&#8217;s talk about graphics cards.\u00a0\u00a0It probably won&#8217;t shock you to learn that the people who make graphics cards are always looking for a way to sell more of them. They have two ways of doing this.<\/p>\n<p>The first way is to sell us prettier pixels. New functionality will be added to cards that can handle some new rendering trick. They get game developers to use the new stuff to make their games look more awesome, and then they sell us cards so we can play the game.<\/p>\n<p>The problem for them is that they can&#8217;t always sell us prettier pixels. Game developers only want to modify their engines so often, and consumers need to get tired of the old pixels before the new tricks can generate hundreds of dollars worth of excitement in the heart of the consumer.<\/p>\n<p>So when they can&#8217;t sell us prettier pixels, they try to sell us more pixels. Maybe that means higher resolutions for bigger monitors, or maybe it means higher framerates. Sometimes a new generation of cards will come out and it&#8217;s basically just the last generation except faster<span class='snote' title='1'>And probably with more fans on it.<\/span>.<\/p>\n<p>So for the last 20 years the pendulum has swung between these two. Sometimes they sell us prettier pixels, sometimes they sell us more pixels.<\/p>\n<p><a href='https:\/\/www.youtube.com\/watch?v=Toft6fMvByA'><div class='imagefull'><img src='https:\/\/www.shamusyoung.com\/twentysidedtale\/images\/tdi_raytracing_slide1.jpg' width=100% alt='That is a LOT of pixels!' title='That is a LOT of pixels!'\/><\/div><\/a><div class='mouseover-alt'>That is a LOT of pixels!<\/div><\/p>\n<p>But for the last few years we&#8217;ve been stuck in more pixels mode. VR needs more pixels. <a href=\"https:\/\/www.youtube.com\/watch?v=Toft6fMvByA\">Huge displays<\/a> need more pixels. Everyone decided they wanted 60fps, and that requires more pixels. It&#8217;s been so long since I saw something genuinely new that I was starting to worry that the industry was running out of tricks.<\/p>\n<p>But a new trick is coming, and it&#8217;s a big one. In fact, calling raytracing a &#8220;trick&#8221; is kind of selling it short. This isn&#8217;t just a new effect to add to our games, it&#8217;s basically a whole new way of lighting a scene.<\/p>\n<p>I should make it clear that this is a very high-level view of a very complex topic. There are actually two different things being tried out right now. The big one is raytracing, which is mostly limited to special tech demos right now. But then there&#8217;s path tracing, which is similar to raytracing. And then we have games use traditional rendering techniques but with raytracing used to create accurate reflections. For the purposes of this article, I&#8217;m just going to smear these ideas together into a big pile of new stuff called &#8220;&#8221;raytracing&#8221; and I&#8217;m not going to draw a distinction between the various techniques. I&#8217;m not trying to confuse you. It&#8217;s just complicated and I&#8217;m trying to keep this short.<\/p>\n<h3>The Problem We Have Now<\/h3>\n<p><div class='imagefull'><img src='https:\/\/www.shamusyoung.com\/twentysidedtale\/images\/tdi_raytracing_slide2.jpg' width=100% alt='Prey 2017: If you&apos;re a super-expert on graphics programming and you study this image very closely, you might notice that the mirror isn&apos;t 100% correct in terms of mirroring things.' title='Prey 2017: If you&apos;re a super-expert on graphics programming and you study this image very closely, you might notice that the mirror isn&apos;t 100% correct in terms of mirroring things.'\/><\/div><div class='mouseover-alt'>Prey 2017: If you&apos;re a super-expert on graphics programming and you study this image very closely, you might notice that the mirror isn&apos;t 100% correct in terms of mirroring things.<\/div><\/p>\n<p>The problem we have right now is that all of our current rendering techniques are basically a big pile of hacks and shortcuts and workarounds. The behavior of light is <b>complicated<\/b>. In the past, getting a computer to replicate that behavior on consumer hardware was completely infeasible. So we had to resort to shortcuts.<\/p>\n<p>I&#8217;d call it smoke and mirrors, but we haven&#8217;t had working mirrors in years. Think about how many games you&#8217;ve seen recently where restroom mirrors were replaced with an inexplicable panel of stainless steel. We&#8217;ll come back to mirrors in a few minutes, but the important thing for now is that the scene of your average AAA video game is built up from dozens of shortcuts and tricks, trying to make a scene look real without requiring the processing power of a Disney render farm. We could never cover all the tricks, but let&#8217;s just talk about one hack: Shadows.<\/p>\n<p>In the 90s, we didn&#8217;t have the processing power to do accurate shadows. It looks weird to have no shadow at all, so developers would stick a little blob of darkness around the feet of characters. Mario 64 did it. Unreal Tournament did it. Deus Ex did it.<\/p>\n<p><div class='imagefull'><img src='https:\/\/www.shamusyoung.com\/twentysidedtale\/images\/tdi_raytracing_slide3.jpg' width=100% alt='Deus Ex: If you&apos;re a super-expert on graphics programming and you study this image very closely, you might notice that the shadows are circles and not shaped like the thing supposedly casting the shadow.' title='Deus Ex: If you&apos;re a super-expert on graphics programming and you study this image very closely, you might notice that the shadows are circles and not shaped like the thing supposedly casting the shadow.'\/><\/div><div class='mouseover-alt'>Deus Ex: If you&apos;re a super-expert on graphics programming and you study this image very closely, you might notice that the shadows are circles and not shaped like the thing supposedly casting the shadow.<\/div><\/p>\n<p>It was a simple effect, but it was enough to get the idea across and make the character look grounded.<\/p>\n<p>But then we wanted to have more realistic shadows. I hope you don&#8217;t mind that I didn&#8217;t want to write my own late-90s style graphics engine to show off how this technology evolved over the years, and instead I&#8217;m just going to illustrate the process by photoshopping this Deus Ex screenshot:<\/p>\n<p><div class='imagefull'><img src='https:\/\/www.shamusyoung.com\/twentysidedtale\/images\/tdi_raytracing_slide4.jpg' width=100% alt='This is not the most exciting moment that Deus Ex has to offer, but at least it&apos;s not from the sewer section.' title='This is not the most exciting moment that Deus Ex has to offer, but at least it&apos;s not from the sewer section.'\/><\/div><div class='mouseover-alt'>This is not the most exciting moment that Deus Ex has to offer, but at least it&apos;s not from the sewer section.<\/div><\/p>\n<p>Let&#8217;s say we want the UNATCO agent to cast a shadow. The way to do this is to get a silhouette of the character, from the perspective of the projecting light source. We save that silhouette in a texture.<\/p>\n<p><div class='imagefull'><img src='https:\/\/www.shamusyoung.com\/twentysidedtale\/images\/tdi_raytracing_slide5.jpg' width=100% alt='The shadow texture on the right would be taken with the camera placed AT the light source. This trick only works for directional lights like spotlights, or the sun. You probably wouldn&apos;t use it on an area light like the one in this screenshot.' title='The shadow texture on the right would be taken with the camera placed AT the light source. This trick only works for directional lights like spotlights, or the sun. You probably wouldn&apos;t use it on an area light like the one in this screenshot.'\/><\/div><div class='mouseover-alt'>The shadow texture on the right would be taken with the camera placed AT the light source. This trick only works for directional lights like spotlights, or the sun. You probably wouldn&apos;t use it on an area light like the one in this screenshot.<\/div><\/p>\n<p>Then we project that texture into the world, away from the light source.<\/p>\n<p><div class='imagefull'><img src='https:\/\/www.shamusyoung.com\/twentysidedtale\/images\/tdi_raytracing_slide6.jpg' width=100% alt='I&apos;m simplifying this concept almost to the point of being misleading, but I&apos;m just trying to drive home the general idea that our graphics tricks are ugly hacks that are trying to look real while not behaving anything like reality.' title='I&apos;m simplifying this concept almost to the point of being misleading, but I&apos;m just trying to drive home the general idea that our graphics tricks are ugly hacks that are trying to look real while not behaving anything like reality.'\/><\/div><div class='mouseover-alt'>I&apos;m simplifying this concept almost to the point of being misleading, but I&apos;m just trying to drive home the general idea that our graphics tricks are ugly hacks that are trying to look real while not behaving anything like reality.<\/div><\/p>\n<p>This gives us a shadow. That&#8217;s nice for a little while, but then people start looking at those jaggy pixels on the edge of the shadow and thinking those are pretty ugly. Also, shadows from nearby light sources shouldn&#8217;t have a hard edge like this. Nearby lights should create a penumbra, a soft edge where we transition from light to shadow<span class='snote' title='2'>Actually, the size of the penumbra varies based on the size of the light source AND distance to target. A large soft-white globe will give soft-edge shadows and a piercing bright point will create sharp-edged shadows.<\/span>.<\/p>\n<p>We can fix both of these problems by just blurring the shadow texture to smooth the edges out and hide those pixel jaggies.<\/p>\n<p><div class='imagefull'><img src='https:\/\/www.shamusyoung.com\/twentysidedtale\/images\/tdi_raytracing_slide7.jpg' width=100% alt='Making things blurry covers up a LOT of problems, although it creates the new problem that now things are blurry.' title='Making things blurry covers up a LOT of problems, although it creates the new problem that now things are blurry.'\/><\/div><div class='mouseover-alt'>Making things blurry covers up a LOT of problems, although it creates the new problem that now things are blurry.<\/div><\/p>\n<p>Oh! Except sometimes that blur will crash into the boundaries of the texture and make horrible clipped edges, so we&#8217;ll need special code to handle that.<\/p>\n<p><div class='imagefull'><img src='https:\/\/www.shamusyoung.com\/twentysidedtale\/images\/tdi_raytracing_slide8.jpg' width=100% alt='I never saw this happen in a production game, but I&apos;ve had this sort of thing happen while I was working the kinks out of my shadow code.' title='I never saw this happen in a production game, but I&apos;ve had this sort of thing happen while I was working the kinks out of my shadow code.'\/><\/div><div class='mouseover-alt'>I never saw this happen in a production game, but I&apos;ve had this sort of thing happen while I was working the kinks out of my shadow code.<\/div><\/p>\n<p>And hang on, shouldn&#8217;t all of the other things in this scene be casting shadows? So we need to make a shadow texture for all of these crates and railings and everything, right? Actually, I guess we should project all of this stuff into one texture. Except, then we won&#8217;t have enough resolution to cover such a large area and the shadows will be horribly blurry. So we have to take multiple textures at different distances and resolutions and stitch them together to hide the seams.<\/p>\n<p>Everything is now insanely complicated, and we&#8217;re only handling one light source! This all gets even more complicated if we have multiple light sources.\u00a0 And this isn&#8217;t even a particularly accurate simulation of light. In the real world, shadows aren&#8217;t a zone of darkness added to a light surface, they&#8217;re an area where light was prevented from reaching the surface in the first place<span class='snote' title='3'>This technique really looks odd under saturated lights. A bright red light will wash the entire scene in red, and then the shadow just makes it darker red because it&#8217;s not really blocking the light. Maybe you could fix this by using negative color shadows, but I&#8217;ve never seen that done.<\/span>.<\/p>\n<p>What a mess. And this is actually one of the older, simpler ways of doing things. Modern AAA games don&#8217;t use the above <a href=\"https:\/\/en.wikipedia.org\/wiki\/Shadow_mapping\">technique<\/a> anymore as it&#8217;s been replaced with a different set of more complicated tricks with a different set of tradeoffs. And that&#8217;s just one trick out of dozens. On top of that we have crepuscular rays, water caustics,\u00a0 volumetric fog, ambient occlusion, depth of field, motion blur, bloom lighting, full-screen antialiasing, and so much more. All of these effects come from separate systems with their own drawbacks, pitfalls, and limitations.<\/p>\n<p>As an example of the kinds of tradeoffs we have to worry about:<\/p>\n<h3>Detail vs. Dynamism<\/h3>\n<p><div class='imagefull'><img src='https:\/\/www.shamusyoung.com\/twentysidedtale\/images\/tdi_raytracing_slide9.jpg' width=100% alt='The radiosity lighting is great, but the shadows are vague and inaccurate. I don&apos;t know if this is a limitation of Valve&apos;s ancient Source Engine, or if I bungled this demo map.' title='The radiosity lighting is great, but the shadows are vague and inaccurate. I don&apos;t know if this is a limitation of Valve&apos;s ancient Source Engine, or if I bungled this demo map.'\/><\/div><div class='mouseover-alt'>The radiosity lighting is great, but the shadows are vague and inaccurate. I don&apos;t know if this is a limitation of Valve&apos;s ancient Source Engine, or if I bungled this demo map.<\/div><\/p>\n<p>Above is a screenshot from a demonstration level I made in the Source Engine, which is what was used in <i>Half-Life 2<\/i> back in 2004. You can see I&#8217;m standing in a hallway that leads to two rooms. Both rooms have an overpowering light in them. The light source is pure white in both rooms. But in the room on the right, the walls are orange. White light is reflecting off those walls and spilling out into the hallway as orange light. This is called radiosity lighting. Light can spill into a room and bounce around corners, talking into account the color of the stuff it&#8217;s being reflected off of. It produces very accurate results. The downside is that it was enormously expensive to calculate on the computers of 2004. The computer might need to work for hours to create the lighting, and once it was done the lighting was fixed. You can&#8217;t move the light source around while the game is running, and changing the orange walls to blue wouldn&#8217;t change the color of the light in the hallway. We call this having the lighting &#8220;baked in&#8221;. Moving objects in the scene couldn&#8217;t create high-detail shadows like this, which means that opening and closing a door won&#8217;t change how much light is coming through the doorway. The lighting is great, but it can&#8217;t change.<\/p>\n<p>That same year, we also got <i>Doom 3<\/i>. That game was focused on dynamic lighting. Lights could move. They could change color. Everything &#8211; even moving objects &#8211; could cast pixel-perfect shadows. The downside is that this couldn&#8217;t use any radiosity lighting. Light literally couldn&#8217;t bounce off of things to hit other things. Even slender railings would cast crushing pure black shadows. This is why the lighting in that game was so harsh. No matter how powerful a light was, the walls couldn&#8217;t scatter it to illuminate other surfaces.<\/p>\n<p><div class='imagefull'><img src='https:\/\/www.shamusyoung.com\/twentysidedtale\/images\/tdi_raytracing_slide10.jpg' width=100% alt='That slender railing is blocking all of the light coming fromthe ceiling, as if all the light was being emitted from an infinitely small point. (Which it is, in this case.)' title='That slender railing is blocking all of the light coming fromthe ceiling, as if all the light was being emitted from an infinitely small point. (Which it is, in this case.)'\/><\/div><div class='mouseover-alt'>That slender railing is blocking all of the light coming fromthe ceiling, as if all the light was being emitted from an infinitely small point. (Which it is, in this case.)<\/div><\/p>\n<p>Do you want beautiful lighting that can&#8217;t change, or brutal lighting that can? I guess it depends on the game. Eventually programmers came up with systems<span class='snote' title='4'>I&#8217;m vague here because I don&#8217;t really understand them. This stuff is too new to fit in my dusty old-school bag of tricks.<\/span> that could do both at the expense of &#8211; you guessed it &#8211; being more complicated and having different tradeoffs. Not just more complicated to code, but more complex for the artists who create the environments.<\/p>\n<p>You&#8217;ll still see this tradeoff at work today. The more sophisticated the lighting is, the more it tends to be baked in, with a majority of the objects in a scene locked in place because those objects are casting shadows that can&#8217;t move. If you&#8217;ve ever played a game where you threw a grenade and wondered why it doesn&#8217;t blast a chair across the room or obliterate the curtains, it&#8217;s probably because the game is using baked lighting. If those objects moved, they&#8217;d leave behind nonsense shadows.<\/p>\n<h3>Raytracing<\/h3>\n<p><div class='imagefull'><img src='https:\/\/www.shamusyoung.com\/twentysidedtale\/images\/tdi_raytracing_slide11.jpg' width=100% alt='Those windows are casting real reflections. Same for the floor. And for everthing else. Like in real life, basically everything is kinda a mirror, but most surfaces are too rough for a legible reflection.' title='Those windows are casting real reflections. Same for the floor. And for everthing else. Like in real life, basically everything is kinda a mirror, but most surfaces are too rough for a legible reflection.'\/><\/div><div class='mouseover-alt'>Those windows are casting real reflections. Same for the floor. And for everthing else. Like in real life, basically everything is kinda a mirror, but most surfaces are too rough for a legible reflection.<\/div><\/p>\n<p>Raytracing is an attempt to do away with all those tricks and hacks we&#8217;ve been using to make our games look like the real world, and instead just simulate light as it really behaves.<\/p>\n<p>As you read this article, billions of photons are pouring out of the screen. Some of them enter your eyes, allowing you to see the screen. Some of them reflect off the walls around you and <b>then<\/b> enter your eye, illuminating the room you&#8217;re in. As photons bounce around, their paths bend as they move through things like glass, and they change in wavelength depending on what sorts of things they run into.<\/p>\n<p>To be clear, raytracing isn&#8217;t an <b>exact<\/b> 1-to-1 simulation of real light. We actually trace light rays going from the eye and into the scene. That&#8217;s backwards from how light travels in reality, but backwards is more efficient because we&#8217;re only simulating the 0.01% of photons that hit the camera and not the 99.99% of photons that hit something else. Also, we can&#8217;t simulate billions of photons, not even with the amazing graphics hardware available today. So we simulate a few thousand, and we can use the information they give us to extrapolate the rest of the scene. It takes massive horsepower to accomplish this and the cards that can pull it off aren&#8217;t cheap here in the back half of 2019, but it is finally possible and the results are amazing.<\/p>\n<p><div class='imagefull'><img src='https:\/\/www.shamusyoung.com\/twentysidedtale\/images\/tdi_raytracing_slide14.jpg' width=100% alt='If you&apos;re a super-expert on graphics programming and you study this technology very carefully, then maybe you can explain to me how to set it up.' title='If you&apos;re a super-expert on graphics programming and you study this technology very carefully, then maybe you can explain to me how to set it up.'\/><\/div><div class='mouseover-alt'>If you&apos;re a super-expert on graphics programming and you study this technology very carefully, then maybe you can explain to me how to set it up.<\/div><\/p>\n<p>Earlier I said I&#8217;d come back to the topic of mirrors. In the old days, mirrors were basically trick windows. The level designer would put a flipped copy of the room on the other side of the glass and the game would show copies of the characters over there. You weren&#8217;t looking into a reflection, you were looking into another space made to look like a reflection.\u00a0 Over the years, most video game mirrors have been variations on this same trick, because calculating a real reflection was too computationally expensive. And then we just gave up, because it wasn&#8217;t worth all the extra complexity and performance concerns for things that are basically just decorations with no gameplay value.<\/p>\n<p><div class='imagefull'><img src='https:\/\/www.shamusyoung.com\/twentysidedtale\/images\/tdi_raytracing_slide12.jpg' width=100% alt='You could make a better mirror by replacing the glass with something more reflective and less transparent, but these early raytracing demos are mostly crude hacks with a lot of hard-coded stuff. There currently aren&apos;t any chrome-like textures available.' title='You could make a better mirror by replacing the glass with something more reflective and less transparent, but these early raytracing demos are mostly crude hacks with a lot of hard-coded stuff. There currently aren&apos;t any chrome-like textures available.'\/><\/div><div class='mouseover-alt'>You could make a better mirror by replacing the glass with something more reflective and less transparent, but these early raytracing demos are mostly crude hacks with a lot of hard-coded stuff. There currently aren&apos;t any chrome-like textures available.<\/div><\/p>\n<p>But with raytracing, everything is different. In the above screenshot,\u00a0 I set up a Minecraft world with a shader pack that uses raytracing. I placed glass blocks in front of black concrete and that created a mirror. This is basically how you build mirrors in real life. You put a reflective layer against a dark background. This isn&#8217;t a trick like in the old days. A programmer didn&#8217;t have to spend days writing code to create this specific effect and tweaking it to look just right. This mirror isn&#8217;t limited to this single location where the local parameters have been tweaked to make sure everything works. This mirror just emerged naturally from the rules of raytracing.<\/p>\n<p>The same thing happens with radiosity lighting. That&#8217;s just the virtual photons bouncing off of stuff, doing their job. And real-time moving shadows? Same thing. A programmer doesn&#8217;t need special code to figure out where a shadow should be and then darken that part of the scene, they just send out a bunch of rays. If something blocks the light then there will be a shadow. We don&#8217;t need to lock all the furniture in place because it&#8217;s casting baked-in shadows. Everything can be dynamic and everything can be lit using the same rules.<\/p>\n<p>In traditional rendering, you have to limit the number of lights in a scene because every shadow-casting light has a cost to it. In <i>Doom 3<\/i> the rule was that no wall should have more than 3 lights shining on it, and the less lights overlapped the better. That explains why so much stuff was mostly illuminated by isolated pools of light. But lights in a raytraced scene are basically free. Shadows are free. Reflections are free. Refraction is free. Radiosity lighting is free. Getting raytracing working requires a ton of processing power, but once the system is running all of these expensive effects emerge for little or no additional cost. As someone who&#8217;s used to the old way of doing things based on rasterizing triangles, this idea feels <b>so<\/b> weird.<\/p>\n<p><div class='imagefull'><img src='https:\/\/www.shamusyoung.com\/twentysidedtale\/images\/tdi_raytracing_slide13.jpg' width=100% alt='Shadows are always realtime, which means we can have destructible walls and movable furniture! I mean, you still have to CODE those things, but now they don&apos;t create intractable lighting problems.' title='Shadows are always realtime, which means we can have destructible walls and movable furniture! I mean, you still have to CODE those things, but now they don&apos;t create intractable lighting problems.'\/><\/div><div class='mouseover-alt'>Shadows are always realtime, which means we can have destructible walls and movable furniture! I mean, you still have to CODE those things, but now they don&apos;t create intractable lighting problems.<\/div><\/p>\n<p>Raytracing is probably a couple of years away from widespread adoption. (Assuming it catches on, obviously.) This is such a big leap that I&#8217;m not sure how AAA games will react to it. This isn&#8217;t like earlier tech where people could muddle through on low-end hardware by turning graphics options down. As of right now, you need hardware specifically designed for raytracing to get an acceptable framerate. This creates the same chicken-and-egg trap that faces VR, where developers don&#8217;t want to fully commit to hardware with a limited install base, and people don&#8217;t want to commit to expensive hardware that doesn&#8217;t have a lot of games. On the other hand, the Playstation 5 will <a href=\"https:\/\/www.wired.com\/story\/exclusive-sony-next-gen-console\/\">reportedly<\/a> support raytracing, and that makes the technology a pretty safe investment for developers. I&#8217;m hoping it takes off. I haven&#8217;t been excited about graphics in ages, but I really dig raytracing.<\/p>\n<p>I guess we&#8217;ll see in the next couple of years.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>This article has a companion video. I try to make the article and the video roughly equal in usefulness, but like the old saying: One second of footage is worth 60,000 words. This video shows off some footage from Minecraft with a raytracing mod, and footage from Control with raytracing enabled. There&#8217;s something amazing about [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[102],"tags":[],"class_list":["post-48019","post","type-post","status-publish","format-standard","hentry","category-weekly-column"],"_links":{"self":[{"href":"https:\/\/www.shamusyoung.com\/twentysidedtale\/index.php?rest_route=\/wp\/v2\/posts\/48019","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.shamusyoung.com\/twentysidedtale\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.shamusyoung.com\/twentysidedtale\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.shamusyoung.com\/twentysidedtale\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.shamusyoung.com\/twentysidedtale\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=48019"}],"version-history":[{"count":16,"href":"https:\/\/www.shamusyoung.com\/twentysidedtale\/index.php?rest_route=\/wp\/v2\/posts\/48019\/revisions"}],"predecessor-version":[{"id":48100,"href":"https:\/\/www.shamusyoung.com\/twentysidedtale\/index.php?rest_route=\/wp\/v2\/posts\/48019\/revisions\/48100"}],"wp:attachment":[{"href":"https:\/\/www.shamusyoung.com\/twentysidedtale\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=48019"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.shamusyoung.com\/twentysidedtale\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=48019"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.shamusyoung.com\/twentysidedtale\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=48019"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}