[video output=day580 member=cmuratori stream_platform=twitch stream_username=handmade_hero project=code title="Investigating Octahedral Interpolation" vod_platform=youtube id=8PxkSisBp3I annotator=Miblo] [0:03][Recap and set the stage for the day streamlining the :lighting system, operating directly in the octahedral map, and hook up the light convection][:speech] [4:58][Determine to hook up the bounce-based light convection][:lighting :speech] [6:02][Demo the current state of the :lighting][:"debug visualisation" :run] [7:57][On assuming we have a bug, and not rationalising away by manufacturing an explanation that the code is correct][:speech] [13:16][Determine to investigate the octahedral interpolation][:"debug visualisation" :lighting :run] [15:50][Prevent GenerateRoom() from varying the floor height][:"procedural generation"] [16:54][Take a close look at the apparent square :lighting falloff artifact][:"debug visualisation" :run] [21:25][Try making SumLight() in CompileZBiasProgram() overwrite the top-level voxel with the value of the first bottom-level voxel][:lighting] [21:58][Note the weird shape of our angular falloff][:"debug visualisation" :lighting :run] [23:19][Scrutinise SumLight() in CompileZBiasProgram() for anything that may affect the angular falloff][:lighting :research] [25:41][Try making SumLight() in CompileZBiasProgram() lookup into the octahedral light map at a known location][:lighting] [26:10][Find no interpolation variance while moving the :camera][:"debug visualisation" :lighting :run] [26:43][Revert SumLight() in CompileZBiasProgram() to interpolate the full voxel hierarchy][:lighting] [26:50][Find that our :lighting interpolates coherently, which suggests that our weirdness is coming from the octahedral light map][:"debug visualisation" :run] [28:15][Revert SumLight(0 in CompileZBiasProgram() to lookup into the octahedral light map in the correct direction][:lighting] [28:21][Take a close look at the octahedral-shaped :lighting falloff artifact, in conjunction with Jeff Knox's octahedral unwrapping visualisation in Desmos[ref site=Desmox page=Octahedral url=https://www.desmos.com/calculator/sayie6xbgl]][:"debug visualisation" :run] [33:31][Disable interpolation in OpenGLChangeToSettings()][:lighting] [34:45][See a hard-edged artifact][:"debug visualisation" :lighting :run] [35:21][Set up to make EndLightingComputation() copy known values to the border rows][:lighting] [37:09][See no change][:"debug visualisation" :lighting :run] [37:18][Make OpenGLChangeToSettings() zoom out the light map viewer][:"debug visualisation" :lighting] [38:18][View the light map][:"debug visualisation" :lighting :run] [38:46][Make EndLightingComputation() copy known values to the border rows][:lighting] [38:56][See the red and green lines in the light map viewer, but not in the game][:"debug visualisation" :lighting :run] [39:46][Enable interpolation in OpenGLChangeToSettings()][:lighting] [40:15][See our red and green, but not at the artifact edges][:"debug visualisation" :lighting :run] [40:33][Disable interpolation in OpenGLChangeToSettings()][:lighting] [40:41][Consider our artifact to occupy the interior of the octahedral light map][:"debug visualisation" :lighting :run] [40:52][Make EndLightingComputation() copy known values to the border columns][:lighting] [41:35][See the yellow and cyan lines in the light map viewer, but not in the game][:"debug visualisation" :lighting :run] [41:54][Enable interpolation in OpenGLChangeToSettings()][:lighting] [42:02][See our yellow and cyan, but not at the artifact edges][:"debug visualisation" :lighting :run] [42:17][Disable interpolation in OpenGLChangeToSettings()][:lighting] [42:22][Consider our copy operation not to be implicated][:"debug visualisation" :lighting :run] [43:08][Try making SumLight() in CompileZBiasProgram() overwrite the top-level voxel with the value of the first bottom-level voxel][:lighting] [43:30][Clearly view our diamond-shaped artifact][:"debug visualisation" :lighting :run] [47:28][Make OpenGLChangeToSettings() zoom out the light map viewer][:"debug visualisation" :lighting] [47:38][See no especially bright areas in the light map viewer][:"debug visualisation" :lighting :run] [48:06][Pan around the light map for our expected bright areas][:"debug visualisation" :"hot reloading" :lighting :programming :run] [53:15][See two identical neighbouring values in the light map][:"debug visualisation" :lighting :run] [54:45][Continuities][:lighting :run] [55:58][Enable interpolation in OpenGLChangeToSettings()][:lighting] [56:14][Discontinuities in the rate of change][:"debug visualisation" :lighting :run] [58:23][Toggle on EDGE_COLORING in EndLightingComputation()][:"debug visualisation" :lighting] [58:30][Disable interpolation in OpenGLChangeToSettings()][:lighting] [58:40][Recall that the artifact is not on an edge copy][:"debug visualisation" :lighting :run] [1:00:17][Make EndLightingComputation() write purple structured art into the interior of the octahedral light map, with thanks to Mike Biddlecombe][:"debug visualisation" :lighting] [1:01:29][See a great swathe of purple, revealing that the artifact is from the interpolation between texels][:"debug visualisation" :lighting :run] [1:02:53][Make EndLightingComputation() write a 3×3 structured art matrix in the octahedral light map][:"debug visualisation" :lighting] [1:05:41][View our structured art][:"debug visualisation" :lighting :run] [1:06:14][Enable interpolation in OpenGLChangeToSettings()][:lighting] [1:06:22][See our bilinear interpolation artifact, and consider trying radial interpolation][:"debug visualisation" :lighting :run] [1:09:06][Make EndLightingComputation() blank out the central texel of our 3×3 matrix][:"debug visualisation" :lighting] [1:09:19][See the bilinear interpolation artifacts radiating from the centre][:"debug visualisation" :lighting :run] [1:10:12][Consider writing our own radial interpolation in CompileZBiasProgram(), seeing what Texture Lookup Functions are available in OpenGL 3.2[ref site="OpenGL Registry" page="The OpenGL Shading Language 1.50 Quick Reference Card" url=https://www.khronos.org/files/opengl-quick-reference-card.pdf]][:lighting :research] [1:14:52][Embark on implementing our own radial interpolation routine in CompileZBiasProgram()][:lighting] [1:19:50][Bilinear Fudge][:blackboard :lighting :mathematics] [1:22:06][Fudging Bilinear to be Radial][:blackboard :lighting :mathematics] [1:28:41][Graph our radial interpolation equation in Desmos[ref site=Desmos page="Untitled Graph" url=https://desmos.com/calculator]][:lighting :mathematics :research] [1:55:28][Understanding our radial discontinuity][:blackboard :lighting :mathematics] [1:57:33][Hack our radial interpolation equation in to CompileZBiasProgram()[ref site="OpenGL Registry" page="The OpenGL Shading Language 1.50 Quick Reference Card" url=https://www.khronos.org/files/opengl-quick-reference-card.pdf]][:lighting :mathematics] [2:05:36][With the radial interpolation toggled off, see our bilinear interpolation artifacts][:"debug visualisation" :lighting :run] [2:06:07][Manually reproduce the bilinear interpolation in CompileZBiasProgram()][:lighting :mathematics] [2:07:17][Bilinear Interpolation][:blackboard :lighting :mathematics] [2:10:17][Toggle on and complete our manual interpolation path in CompileZBiasProgram()[ref site="OpenGL Registry" page="The OpenGL Shading Language 1.50 Quick Reference Card" url=https://www.khronos.org/files/opengl-quick-reference-card.pdf]][:lighting :mathematics] [2:12:17][Hit and fix shader validation errors][:lighting :mathematics :programming :run] [2:13:36][See our manual bilinear interpolation artifacts][:"debug visualisation" :lighting :run] [2:14:10][Toggle off our manual interpolation path in CompileZBiasProgram()][:lighting :mathematics] [2:14:16][See a difference between our and OpenGL's bilinear interpolation][:"debug visualisation" :lighting :run] [2:15:26][Offsetting our manual bilinear interpolation][:blackboard :lighting :mathematics] [2:16:24][Offset our manual bilinear interpolation back by half a pixel in CompileZBiasProgram()][:lighting :mathematics] [2:16:48][See no difference between our and OpenGL's bilinear interpolation][:"debug visualisation" :lighting :programming :run] [2:17:35][Toggle on our radial interpolation in CompileZBiasProgram()][:lighting :mathematics] [2:18:19][See our radial falloff][:"debug visualisation" :lighting :run] [2:18:45][Toggle off our manual interpolation path in CompileZBiasProgram()][:lighting :mathematics] [2:18:55][See OpenGL's bilinear interpolation artifact return][:"debug visualisation" :lighting :run] [2:19:01][Toggle on our manual interpolation path in CompileZBiasProgram()][:lighting :mathematics] [2:19:06][Take a close look at our radial interpolation][:"debug visualisation" :lighting :run] [2:19:39][Let EndLightingComputation() produce real :lighting values in our 3×3 structured art matrix][:lighting] [2:19:49][Perceive but prefer our radial interpolation discontinuities][:"debug visualisation" :lighting :run] [2:20:14][Revert SumLight() in CompileZBiasProgram() to interpolate the full voxel hierarchy][:lighting] [2:21:01][View our smoothly interpolated :lighting][:"debug visualisation" :run] [2:21:46][Revert CompileZBiasProgram() to modulate the world's real colours with light][:lighting] [2:21:55][View our really lit world][:lighting :run] [2:22:16][Q&A][:speech] [2:22:50][@devsigner][Q: Why is the :lighting behind the character so dark? Shouldn't a point light be more round?] [2:24:03][@somebody_took_my_name][Q: For a look at Desmos: see 'Untitled Graph'[ref site=Desmos page="Untitled Graph" url=https://www.desmos.com/calculator/2yex0yzdk5]][:mathematics] [2:26:28][@centhusiast][Q: How fast is this :lighting method when we compile in debug mode?] [2:26:56][@jessem3y3r][Q: I have to say that your debug videos are often more educational than implementation-heavy ones. Very insightful into your process. Thanks!] [2:28:38][@xrxr13579][Q: Is octahedral :lighting the only way to go for what you want?] [2:29:32][@philliptrudeau][Q: Once you take depth samples, could you do bounce :lighting by fetching the depth sample and then moving that far down the normal to seek directly to the next voxel?] [2:30:26][@somebody_took_my_name][Q: Sorry that was just a temp graph, I hadn't saved it. But now with an account and all, the permanent link (I guess) is here[ref site=Desmos page="Four pixel interpolation" url=https://www.desmos.com/calculator/qmephgc1p5]][:mathematics] [2:31:36][@kniffel5][Q: Could you do a stream on RAD's Telemetry[ref site="RAD Game Tools" page="Telemetry Performance Visualization System" url=http://www.radgametools.com/telemetry.htm] one day, showing all the things you can do with it? I'm really interested in the tool, but the only good video source on it is [@naysayer88 Jon Blow], and his streams aren't very "tutorial-y" by nature!] [2:33:23][@philliptrudeau][Q: With the octahedral map, both the bilinear filtering and the "puffy" filtering seemed to have a pretty quick falloff between samples. Would you consider doing something like bi-cubic filtering for a smoother blend?][:lighting] [2:37:08][@centhusiast][Q: Do you you use any equation for the light density attenuation?][:lighting] [2:37:29][@kniffel5][Q: Thanks! Do you know if RAD has discounts for students?] [2:38:37][@centhusiast][Q: Yes, I meant intensity attenuation?] [2:39:28][@xrxr13579][Q: Would you ever go back to RAD?] [2:40:06][@mattiamanzati][Q: Does the paper from nVidia about octahedral sampling[ref title="Dynamic Diffuse Global Illumination with Ray-Traced Irradiance Fields" author="Jean-Philippe Guertin, Derek Nowrouzezahrai, Morgan McGuire" url=http://jcgt.org/published/0008/02/01/] cover also the sampling filter, or did they just use linear and bump up the size of the bitmap to have more samples?][:lighting] [2:47:47][@roblovski][Q: When doing game logic, do you think it's ever a good idea to write in async / await style and have that transformed into a state machine?] [2:50:36][@xrxr13579][Q: Thoughts on the ML family of languages and tagged unions?][:language] [2:51:18][@centhusiast][Q: Do you know about the inverse distance weight interpolation method? Do you think it can be used for games?] [2:51:34][@nickito97][Q: What do you think of C++20 modules and, separately, of constexpr in C++ in general?][:language] [2:51:56][@cyberimmersion][Q: I've only really focused much on python, and I'm trying to learn another :language. What do you think of Golang?] [2:52:08][Wind it down][:speech] [/video]