[video output=day427 member=cmuratori stream_platform=twitch stream_username=handmade_hero project=code title="Debugging Lighting Flicker" vod_platform=youtube id=wvkWI22gV3U annotator=Miblo] [0:01][Recap and set the stage for the day doing :lighting :optimisation][:rendering :speech] [2:37][:Run the game to see our current :lighting situation][:rendering] [4:10][Determine to enable OpenGLRenderCommands() to correctly clear the backbuffer][:hardware :research] [6:16][Step in to OpenGLRenderCommands() to see that it may be clearing the wrong render target][:hardware :rendering] [7:02][Read through OpenGLRenderCommands(), to see if we are indeed clearing the wrong target][:hardware :rendering :research] [8:05][Step through OpenGLRenderCommands() watching the OnPeelIndex][:hardware :rendering :run] [8:37][Make OpenGLRenderCommands() increment the HeaderAt pointer inside the commands loop][:hardware :rendering] [10:49][:Run the game to see that the clear is back to the correct behaviour][:hardware :rendering] [12:31][Read through the :lighting code with a view to optimising it][:optimisation :rendering :research] [15:33][:Run the game and point out that we are not leveraging our previously computed :lighting][:optimisation :rendering] [16:27][Enable LightingTest() to use the previously computed :lighting emission][:optimisation :rendering] [20:36][:Run the game to see flickering :lighting][:optimisation :rendering] [21:07][Make LightingTest() save the new :lighting emission back] [22:30][:Run the game to see that we're a lot slower][:lighting :optimisation :rendering] [22:51][Reduce the RayCount in ComputeLightPropagation()][:lighting :optimisation :rendering] [23:16][:Run the game to see that the :lighting is still very flickery][:optimisation :rendering] [24:03][Increase the RetainedEmissionCoefficient in LightingTest()][:lighting :research :rendering] [24:16][:Run the game to see the light spreading][:lighting :optimisation :rendering] [25:24][Change ComputeLightPropagation() to use a power-decaying scheme][:lighting :rendering] [27:50][:Run the game to see more reasonable :lighting][:optimisation :rendering] [28:01][Tweak the BlendAmount, RayCount and IterationCount in ComputeLightPropagation()][:lighting :optimisation :rendering] [29:32][:Run the game and consider that a single pass on the :lighting may be usable][:optimisation :rendering] [30:39][Determine to rework ComputeLightPropagation() to compute the :lighting in a single pass][:optimisation :rendering :research] [33:52][Rework ComputeLightPropagation() to compute the :lighting using a single-pass point collection-style scheme][:optimisation :rendering] [47:31][Resolving discontinuities caused by snapping the :lighting samples to spatial partitions][:blackboard :geometry :rendering] [53:09][Enable ComputeLightPropagation() to blend the :lighting emission by the DistanceSq][:optimisation :rendering] [55:43][Describe the InvDistanceSq computation – (1 / (1 + x²)) – via a graph[ref site=Google page="graph (1 / (1 + x^2))" url=https://encrypted.google.com/search?q=graph+%281+%2F+%281+%2B+x%5E2%29%29]][:mathematics :research] [58:06][Continue to enable ComputeLightPropagation() to accumulate, blend and attenuate the light][:lighting :optimisation :rendering] [1:16:47][:Run the game to see that we get a little grey :lighting, and step through ComputeLightPropagation()][:optimisation :rendering] [1:18:03][Remove NextFree from lighting_point][:lighting :rendering] [1:18:30][Continue to step through ComputeLightPropagation() inspecting the :lighting values][:rendering :run] [1:22:06][Increase the Power value in ComputeLightPropagation()][:lighting :rendering] [1:22:48][:Run the game to see that the :lighting is still flickering][:optimisation :rendering] [1:24:24][Make ComputeLightPropagation() propagate forwards the previously computed :lighting][:optimisation :rendering] [1:25:30][:Run the game and still see flicker, due to the unpredictable moonlight sampling][:lighting :rendering] [1:28:09][Enable the BlendAmount in ComputeLightPropagation() to work as expected][:lighting :optimisation :rendering] [1:31:10][:Run the game without the skylight, to find that BlendAmount works as expected][:lighting :optimisation :rendering] [1:31:55][Reconsider the problem in light of the fact that a lower BlendAmount does not reduce the flicker][:lighting :rendering :research] [1:36:38][Make ComputeLightPropagation() and AccumulateSample() sum the :lighting identically][:optimisation :rendering] [1:38:37][:Run the game to see that it is exactly as it was, and step through ComputeLightPropagation()][:lighting :optimisation :rendering] [1:40:50][Enable ComputeLightPropagation() to measure the total light removed and distributed][:lighting :optimisation :rendering] [1:42:30][Step through ComputeLightPropagation() to see that TotalAdded is less than TotalRemoved, and that a very low BlendAmount still fails to prevent the flicker][:lighting :rendering :run] [1:49:04][Read carefully through LightingTest() to double-check our assumptions][:lighting :optimisation :rendering :research] [1:50:23][Make ComputeLightPropagation() sum in (and not clear) the AverageDirectionToLight][:lighting :optimisation :rendering] [1:51:47][:Run the game to see the flicker-free :lighting][:optimisation :rendering] [1:52:20][Work on the transmission amount in ComputeLightPropagation()][:lighting :optimisation :rendering] [1:59:12][:Run the game and consider that we have a bug in the light removal][:lighting :optimisation :rendering] [2:01:30][Q&A][:speech] [2:03:04][@hengo][Q: I don't think your :lighting approach (it's kinda like photon mapping but in weird) will work. I think it's worth to rethink your whole idea][:rendering] [2:03:33][@vateferfout][Q: Doesn't a surface need a hit to have its light reduced? If nothing hits the surface, the light will remain constant][:lighting :rendering] [2:04:47][@enyo_enev][Q: EmitC += Weight*ContribC, isn't that wrong? It should be RemovedC I think. I may be wrong of course] [2:05:21][@steplery][Q: What editor are you using?] [2:05:28][@printf_armin][Q: Is the RPI still a thing?] [2:05:41][Consider the bidirectional nature of the :lighting][:rendering :research] [2:07:14][@hengo][Q: I study game engineering, so I had some courses about :rendering and :lighting. What you try is kinda over the top for a live game. I would advise to look into radiosity] [2:08:46][@jamoflaw][Q: Raspberry Pi] [2:10:00][Determine to make ComputeLightPropagation() bidirectional, using one array, tomorrow[ref site=Wikipedia page="Radiosity (computer graphics)" url=https://en.wikipedia.org/wiki/Radiosity_(computer_graphics)]][:lighting :rendering :research] [2:13:26][@hengo][Q: I thought radiosity approximates the light for one area and not trace single rays to the areas][:lighting :rendering] [2:14:27][@kareshikraise][Q: McGuire's 2016 paper "Deep G Buffer for Stable Global Illumination"[ref site=NvIDIA page="Deep G-Buffers for Stable Global Illumination Approximation" url=http://research.nvidia.com/publication/deep-g-buffers-stable-global-illumination-approximation] has a very good implementation of radiosity and his implementation of a deep g buffer is analogous to the depth peeling you are using in [~hero Handmade Hero]] [2:16:51][@inlibertate][Are you implementing transparency?][:rendering] [2:17:33][Reenable the particles and :run the game to show the transparency][:"particle system" :programming] [2:18:18][@enyo_enev][Q: When you remove the light of the current frame RemoveC after, say, 5 frames, you have to in some way clear DestC and add only SourceC and restart the blend, otherwise it will add forever? Very small portions will get added constantly. Did I misunderstand something?][:lighting :rendering] [2:20:07][Try to make ComputeLightPropagation() accumulate to a constant amount of light][:lighting :optimisation :rendering] [2:24:31][:Run the game to see that this doesn't seem to be working, and step through it to see why][:lighting :optimisation :rendering] [2:26:25][Try hard-setting SourceSum][:lighting :optimisation :rendering] [2:27:40][:Run the game to see the effects of this][:lighting :optimisation :rendering] [2:31:53][Double-check in ComputeLightPropagation() that the light is being clamped][:lighting :optimisation :rendering] [2:32:49][:Run the game to determine that we still have issues][:lighting :optimisation :rendering] [2:34:53][Consider that we are close to this working reliably][:lighting :rendering :speech] [2:36:22][@staythirsty90][Q: What comes after :lighting? Any ideas?][:rendering] [2:37:10][@inlibertate][Q: How big is the current codebase, loc wise?[ref site=GitHub page="AlDanial/cloc" url=https://github.com/AlDanial/cloc]] [2:39:23][@naysayer88][@cmuratori Can you work Yakety Sax into this program somehow?] [2:40:25][@naysayer88][@cmuratori Change one note, like Vanilla Ice did] [2:41:01][Shut it down][:speech] [/video]