From 91a37dfd722beefdd6c8408a57946e4dfd8929a1 Mon Sep 17 00:00:00 2001 From: Matt Mascarenhas Date: Tue, 16 Jun 2020 06:41:57 +0100 Subject: [PATCH] Index hero/code610 --- cmuratori/hero/code/code610.hmml | 160 +++++++++++++++++++++++++++++++ 1 file changed, 160 insertions(+) create mode 100644 cmuratori/hero/code/code610.hmml diff --git a/cmuratori/hero/code/code610.hmml b/cmuratori/hero/code/code610.hmml new file mode 100644 index 0000000..1ea13bb --- /dev/null +++ b/cmuratori/hero/code/code610.hmml @@ -0,0 +1,160 @@ +[video output=day610 member=cmuratori stream_platform=twitch stream_username=handmade_hero project=code title="Removing Incorrect Voxel-Voxel Reflections" vod_platform=youtube id=7w82SyDmyR8 annotator=Miblo] +[0:01][Recap and set the stage for the day][:speech] +[0:51][Demo the current state of our grid-based ray cast :lighting, noting the occasional feedback][:run] +[3:30][Determine to: 1) visualise :lighting energy levels, and 2) interpolate the lighting more diffusely, to avoid the squared artifacting][:"debug visualisation" :run] +[6:41][Prevent DebugDrawColorDir() from factoring the Intensity in to the line length][:"debug visualisation" :lighting] +[7:22][Check out our balled octahedral map DiffuseMap :lighting directions][:"debug visualisation" :run] +[7:37][Let DebugDrawColorDir() factor the 0–1 clamped Intensity in to the line length][:"debug visualisation" :lighting] +[8:15][Check out our more tractable octahedral map DiffuseMap :lighting directions][:"debug visualisation" :run] +[9:31][Consider our bounce-lighting to be plausible][:"debug visualisation" :lighting :run] +[10:39][Leave our :lighting flicker for later][:"debug visualisation" :run] +[11:38][Determine to establish the notion of :lighting energy levels][:"debug visualisation" :run] +[12:55][Maintaining Constant Energy][:blackboard :lighting] +[16:13][Explain that BuildDiffuseLightMaps() pre-creates incoming :lighting energy values][:research] +[17:18][Specular to Diffuse Blend][:blackboard :lighting] +[19:39][Cosine-falloff Scattering of Photons][:blackboard :lighting] +[22:21][Make BuildDiffuseLightMaps() scatter out only as much light as comes in][:lighting] +[29:54][Our world contains a lot less light][:lighting :run] +[30:15][Let GenerateRoom() add lamps][:lighting :"procedural generation"] +[30:44][Our lamps don't bounce much light][:lighting :run] +[31:13][Increase the lamps' light intensity from 2 to 10 in GenerateRoom()][:lighting :"procedural generation"] +[31:26][Our lamps bounce more light][:lighting :run] +[31:38][Increase the lamps' light intensity from 10 to 100 in GenerateRoom()][:lighting :"procedural generation"] +[31:57][Our world ends up turning red][:lighting :run] +[32:09][Decrease the lamps' light intensity from 100 to 50 in GenerateRoom()][:lighting :"procedural generation"] +[32:23][Our light is not propagating stably][:lighting :run] +[34:16][Scrutinise BuildDiffuseLightMaps() for bugs][:lighting :research] +[35:21][Prevent GridRayCast() from applying the cosine-falloff to ReflectColorFoo][:lighting] +[36:02][Our light is still not propagating stably][:lighting :run] +[37:11][Let GridRayCast() sample the light when our ray also does not hit][:lighting] +[37:49][Our light now propagates][:lighting :run] +[37:59][Decrease the lamps' light intensity from 50 to 10 in GenerateRoom()][:lighting :"procedural generation"] +[38:15][Our light still propagates][:lighting :run] +[38:23][Increase the lamps' light intensity from 10 to 15 in GenerateRoom()][:lighting :"procedural generation"] +[38:26][Our light looks great][:lighting :run] +[38:49][Increase the lamps' light intensity from 15 to 20 in GenerateRoom()][:lighting :"procedural generation"] +[39:04][Our light does seem to leak again great][:lighting :run] +[40:11][Prevent GenerateRoom() from adding lamps, and increase the intensity of the debug light by 10× in UpdateAndRenderWorld()][:lighting :"procedural generation"] +[40:43][Our light is powerful enough to bounce][:lighting :run] +[41:03][Increase the intensity of the debug light from 10 to 20 in UpdateAndRenderWorld()][:lighting :"procedural generation"] +[41:20][Our debug light bounces and leaks][:lighting :run] +[41:47][Scrutinise the termination :sampling in GridRayCast() for bugs][:lighting :research] +[43:24][Test preventing terminator hits from transferring the light in GridRayCast()][:lighting] +[44:29][Our light still leaks][:lighting :run] +[44:59][Test preventing early-outs from transferring the light in GridRayCast()][:lighting] +[45:19][Our light no longer leaks][:lighting :run] +[45:57][Scrutinise the terminator :sampling code in GridRayCast()][:lighting :research] +[48:01][Make ComputeWalkTable() terminate within the current cell, not sample from the next one][:lighting] +[48:42][Our light still leaks][:lighting :run] +[49:34][Add a PieceType_Occluder to entity_visible_piece_flag for UpdateAndRenderEntities() to use][:"entity system"] +[52:22][Our light spreads, not occluded][:lighting :run] +[52:37][Make GenerateRoom() add occluders, introducing AddPieceOccluder()][:"entity system" :"procedural generation"] +[55:43][Check out our occluders][:"debug visualisation" :"entity system" :lighting :"procedural generation" :run] +[56:04][Make GenerateRoom() extend the wall occluders to the top of the tile][:"entity system" :"procedural generation"] +[58:35][Our occluders are not aligned properly][:"entity system" :"procedural generation" :run] +[58:47][Make GenerateRoom() size the occluders relative to their position][:"entity system" :"procedural generation"] +[59:22][Our light leaks less][:lighting :run] +[1:01:20][Our light does leak below from the start][:lighting :run] +[1:01:30][Test preventing apron hits from transferring the light in GridRayCast()][:lighting] +[1:02:45][Our light still leaks][:lighting :run] +[1:03:01][Test preventing terminator hits from transferring the light in GridRayCast()][:lighting] +[1:03:15][Our light no longer leaks][:lighting :run] +[1:03:25][Scrutinise the terminator related code in GridRayCast() and ComputeWalkTable()][:lighting :research :sampling] +[1:07:44][See our non-leaky light][:lighting :run] +[1:08:02][Let terminator hits transfer the light in GridRayCast()][:lighting] +[1:08:10][Our light leaks][:lighting :run] +[1:08:59][Scrutinise the termination code ComputeWalkTable()][:lighting :research :sampling] +[1:10:27][Remove the DEBUG_ZERO code from GridRayCast()][:lighting] +[1:10:50][Edit our DebugGridIndex towards a grid index below our orphanage][:"debug system" :"debug visualisation" :lighting :run] +[1:11:46][Try setting DebugGridIndex to 10788 in UpdateLighting()][:"debug system" :lighting] +[1:12:14][Edit our DebugGridIndex towards a grid index below our orphanage][:"debug system" :"debug visualisation" :lighting :run] +[1:12:35][Try setting DebugGridIndex to 11788 in UpdateLighting()][:"debug system" :lighting] +[1:12:47][Edit our DebugGridIndex towards a grid index below our orphanage][:"debug system" :"debug visualisation" :lighting :run] +[1:13:04][Try setting DebugGridIndex to 13788 in UpdateLighting()][:"debug system" :lighting] +[1:13:23][Edit our DebugGridIndex and DebugRayIndex to 13586 and 335][:"debug system" :"debug visualisation" :lighting :run] +[1:14:40][Make UpdateLighting() set DebugGridIndex and DebugRayIndex to 13586 and 335, and increase the height of our octahedron drawing region in DebugDrawOctahedralValues()][:"debug system" :lighting] +[1:15:45][Hit a LIGHT_ATLAS_ASSERT in GetTileUnclamped()][:"debug system" :lighting :run] +[1:15:57][Fix the VoxStart centering computation in DebugDrawOctahedralValues()][:"debug visualisation" :lighting] +[1:16:35][See our taller octahedron drawing stack][:"debug visualisation" :lighting :run] +[1:16:49][Try making DebugDrawOctahedralValues() draw the entire height's worth of octahedral values][:"debug visualisation" :lighting] +[1:17:06][Hit an assertion in PushQuad()][:"debug system" :lighting :run] +[1:17:09][Make DebugDrawOctahedralValues() originate the octahedral drawing region at 0 in z][:"debug visualisation" :lighting] +[1:17:42][Check out our nonsensical octahedral values down below the orphanage][:"debug visualisation" :lighting :run] +[1:18:06][Note that, while we can only sample from cells inside our :lighting voxel, we may cast outside it][:research :sampling] +[1:18:31][Pick a grid cell to closely observe][:"debug visualisation" :lighting :run] +[1:20:12][Make UpdateLighting() set DebugGridIndex to 0, and remove the AtlasToSpatialGrid expansion (beyond the apron)][:"debug system" :lighting] +[1:21:04][Find the DebugGridIndex (717) and DebugRayIndex (531) for our close observation grid cell and ray][:"debug system" :"debug visualisation" :lighting :run] +[1:25:08][Make UpdateLighting() set DebugGridIndex and DebugRayIndex to 717 and 531][:"debug system" :lighting] +[1:25:19][Take a look at our debug ray][:"debug system" :"debug visualisation" :lighting :run] +[1:25:35][Make DebugDrawOctahedralValues() position the lighting voxel to encompass our ray's target hit][:"debug visualisation" :lighting] +[1:26:28][Our target is indeed receiving light was somewhere][:"debug system" :"debug visualisation" :lighting :run] +[1:28:48][Make ComputeVoxelIrradianceAt() take an OcclusionN which opposes our :sampling direction, until we hit][:lighting] +[1:31:22][Our light no longer leaks][:"debug visualisation" :lighting :run] +[1:32:13][Increase the intensity of the debug light from 20 to 50 in UpdateAndRenderWorld()][:lighting :"procedural generation"] +[1:32:57][Our light leaks a little bit][:"debug visualisation" :lighting :run] +[1:33:10][Decrease the intensity of the debug light from 50 to 30 in UpdateAndRenderWorld()][:lighting :"procedural generation"] +[1:33:18][Our light seems to leak][:"debug visualisation" :lighting :run] +[1:33:53][Decrease the intensity of the debug light from 30 to 10 in UpdateAndRenderWorld(), let UpdateAndRenderEntities() colour occluders like normal and GenerateRoom() add lamps][:lighting :"procedural generation"] +[1:34:29][Check out our :lighting][:run] +[1:35:21][Make GenerateRoom() add occluders for trees][:lighting :"procedural generation"] +[1:36:49][Check out our occluding trees][:lighting :run] +[1:37:10][Make GenerateRoom() add shrunken occluders for trees][:lighting :"procedural generation"] +[1:39:10][Hop towards the outside area][:lighting :run] +[1:39:21][Make UpdateAndRenderEntities() draw occluder outlines][:"debug visualisation" :lighting] +[1:39:35][Our trees lack occluders][:lighting :run] +[1:39:51][Fix GenerateRoom() to use the expanded TreeVol for the occluder][:lighting :"procedural generation"] +[1:40:02][Check out our thinned tree occluders][:lighting :run] +[1:40:09][Make GenerateRoom() further thin the tree occluder, and shrink its height][:lighting :"procedural generation"] +[1:42:43][Check out our thinned and shrunken tree occluders][:lighting :run] +[1:43:37][Decrease the LIGHT_FLOOR_VALUE from 0.2 to 0.0][:lighting] +[1:44:40][Admire our more lit world][:lighting :run] +[1:45:37][Prevent UpdateAndRenderEntities() from drawing occluder outlines, and UpdateLighting() calling DebugDrawOctahedralValues()][:"debug visualisation" :lighting] +[1:46:01][Admire our :lighting][:run] +[1:46:49][Prevent PushLight() from drawing light outlines, and make AddSnake() increase the intensity of the lamps][:"debug visualisation" :lighting] +[1:47:40][Admire our :lighting, and plan for: 1) adapting the power curve; 2) better spreading; and 3) reducing the noise][:run] +[1:49:20][Q&A][:speech] +[1:49:45][@mindmark42][Q: In the diffuse map weighting divide, could you get divide by zero?][:lighting] +[1:51:05][@vaualbus][Q: With this system, how could we give a more physically-based :rendering look to the light?][:lighting] +[1:52:36][@pragmascrypt][Q: Does the diffuse bounce use the albedo of the materials yet to color the bounce light?][:lighting] +[1:53:15][Make trees bounce green light, and everything else bounce blue][:lighting :"procedural generation"] +[1:54:00][See our tinted light][:lighting :run] +[1:54:34][Make trees bounce yellow light][:lighting :"procedural generation"] +[1:54:48][See our tinted light][:lighting :run] +[1:55:35][Make trees bounce red light][:lighting :"procedural generation"] +[1:55:46][See our red-tinted trees][:lighting :run] +[1:56:06][Revert the light tinting][:lighting :"procedural generation"] +[1:56:40][@uplinkcoder][Q: Can you compare with the older raycast?][:lighting] +[1:56:57][Disable LIGHTING_USE_GRID][:lighting] +[1:57:03][Check the old AABB ray cast :lighting][:run] +[1:58:35][@miltondts][Q: After the shader modification, it appears the light is still leaking. Why is that?][:lighting] +[1:59:08][Enable LIGHTING_USE_GRID][:lighting] +[1:59:18][Our light doesn't seem to leak][:lighting :run] +[2:01:12][Increase the intensity of the debug light from 10 to 50 in UpdateAndRenderWorld()][:lighting] +[2:01:39][Our light does leak][:lighting :run] +[2:01:50][Decrease the intensity of the debug light from 50 to 10 in UpdateAndRenderWorld()][:lighting] +[2:02:15][Make GenerateRoom() add ceiling occluders][:lighting :"procedural generation"] +[2:04:29][Check out our ceiling][:lighting :"procedural generation" :run] +[2:04:52][Increase the intensity of the debug light from 10 to 50 in UpdateAndRenderWorld()][:lighting] +[2:05:10][Our light does leak][:lighting :run] +[2:05:25][Decrease the intensity of the debug light from 50 to 10 in UpdateAndRenderWorld()][:lighting] +[2:05:56][Check our regularly non-leaking light][:lighting :run] +[2:06:36][@i_am_seabass][Q: Is it possible to smooth out the :lighting so it's not flickering as much?] +[2:07:14][@sharlock93][Q: From what I have "perceived" watching [~hero Handmade Hero] is that :lighting has taken up a pretty sizeable chunk of the episodes. Is lighting this inherently complex or am I missing something?] +[2:07:57][@toocanzs][Q: What are your plans to fix the square looking interpolation?][:lighting] +[2:08:24][@internationalizationist][Q: Do you think, will there be such topics with which we (you) will spend as much time as with light?][:lighting] +[2:08:47][@billdstrong][Q: Even :"fluid simulation", such as plasma?] +[2:11:27][@ravarix][@handmade_hero I'd argue :networking which has the same issue. Trying to simulate two things which are apart as temporally the same] +[2:12:24][@andrevon][Q: Yet it seems like when you walk you drag the light behind you with inertia, more like a liquid. Is that on purpose or an effect of computation per frame?][:lighting] +[2:13:53][@ravarix][I'm sorry, but that just sounds ignorant to the complexities of game :networking] +[2:16:14][@internationalizationist][Q: What is so special in RTX?][:hardware] +[2:17:04][@equivocatorrr][Q: Is the difficulty of global illumination part of the reason why you're doing it?][:lighting] +[2:18:03][@ttbjm][Q: Even the RTX version of Minecraft has noticeable light lag][:hardware :lighting] +[2:19:06][@philliptrudeau][Q: If someone were making a different game with much sparser scenes containing more complex geometry, would you have any alternative prescriptions? Could the probes be arranged in a sparse grid? Or in camera-frustum-space rather than world-space?][:lighting] +[2:21:36][@andrevon][Q: When you tested the secondary bounces with the red light, it seemed like it only worked in left and down directions. Do you have an explanation for that?][:lighting] +[2:23:13][Scrutinise the obstruction Coefficient array computation code in ComputeVoxelIrradianceAt()][:lighting :research] +[2:24:08][Masking out obstructed light cells][:blackboard :lighting] +[2:25:28][@brimonk][Q: How does an RTX card actually perform ray tracing? Is it similar to what the PS5 can provide, which is hardware to work on a BVH structure to perform ray tracing, or is that different?][:hardware :lighting] +[2:30:18][@mindmark42][Q: Are the probes in the wall still getting cleared to zero?][:lighting] +[2:30:48][@mystran][The "ray incoherence" is really why a regular GPU has trouble with it as well since thread divergence wreaks havoc with traditional SIMT][:lighting :threading] +[2:34:46][Thank you, everyone][:speech] +[/video]