[video member=cmuratori stream_platform=twitch stream_username=handmade_hero project=code title="Debugging Octahedral Shading" vod_platform=youtube id=CcK-Yshqg1w annotator=Miblo] [0:03][Recap and set the stage for the day][:speech] [0:31][Demo our octahedral light map][:"debug visualisation" :lighting :run] [3:23][Understanding the Octahedron[ref title="Survey of Efficient Representations for Independent Unit Vectors" author="Zina H. Cigolle, Sam Donow, Daniel Evangelakos, Michael Mara, Morgan McGuire, Quirin Meyer" url=http://jcgt.org/published/0003/02/01/]][:lighting :research] [4:55][Orienting the octahedral wrapping by importance][:"debug visualisation" :lighting :run] [6:06][Determine to fill in the cracks and sample the octahedron in the shaders][:lighting :speech] [7:36][Make SampleLighting() in CompileZBiasProgram() light the pixels by their position within voxels][:"debug visualisation" :lighting] [9:32][Check out our lit voxels][:"debug visualisation" :lighting :run] [10:43][Determine to sample from our octahedral map][:lighting :research :run :sampling] [12:28][Set up SampleLighting() to sample from the octahedral light map][:lighting :sampling] [15:54][Make SampleLighting() compute the location from where to sample the octahedral light map][:lighting :sampling] [27:33][Set up CompileZBiasProgram() to pass the values required by SampleLighting() to lookup into the octahedral light map][:lighting :sampling] [28:43][Consider not using different resolutions for the light and depth maps[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/]][:lighting :research] [34:04][Set up CompileZBiasProgram() to pass the LIGHT_LOOKUP_SQUARE_DIM to SampleLighting()][:lighting :sampling] [34:50][Voxel Atlas UVs][:blackboard :mathematics] [40:40][Make SampleLighting() compute the dimensions required to lookup into the octahedral light map][:lighting :sampling] [48:19][Hit shader errors][:lighting :run :sampling] [49:18][Fix the Result assignments in SampleLighting()][:lighting :sampling] [49:51][See our darkly and incorrectly lit world][:lighting :run :sampling] [50:49][Change SampleLighting() to orient our lookup around the octahedron centres][:lighting :sampling] [55:22][Hit shader errors][:lighting :run :sampling] [55:30][Fix naming in SampleLighting()][:lighting :sampling] [55:42][See our discontinuously lit world][:lighting :run :sampling] [58:13][Try making SampleLighting() lookup into a shrunken area of the octahedral light map][:lighting :sampling] [58:48][See no improvement][:lighting :run :sampling] [59:41][Introduce VOXEL_OFFSET_C() and VOXEL_OFFSET_D() for EndLightingComputation() to call][:lighting] [1:03:57][Verify that our new macros work][:lighting :run] [1:04:09][Set up to copy the values at the seams around the octahedron[ref title="Survey of Efficient Representations for Independent Unit Vectors" author="Zina H. Cigolle, Sam Donow, Daniel Evangelakos, Michael Mara, Morgan McGuire, Quirin Meyer" url=http://jcgt.org/published/0003/02/01/]][:lighting :research] [1:06:40][Make EndLightingComputation() copy the values at the seams around the octahedron[ref title="Survey of Efficient Representations for Independent Unit Vectors" author="Zina H. Cigolle, Sam Donow, Daniel Evangelakos, Michael Mara, Morgan McGuire, Quirin Meyer" url=http://jcgt.org/published/0003/02/01/]][:lighting] [1:09:12][Check out the light map][:lighting :run] [1:09:39][Toggle on the coloured octahedron in EndLightingComputation(), and make OpenGLChangeToSettings() zoom in to it][:"debug visualisation" :lighting] [1:10:31][Check out the light map to see no copying][:lighting :run] [1:10:47][Make EndLightingComputation() copy in to the bottom row of the octahedron][:lighting] [1:11:39][See copying in the light map][:lighting :run] [1:11:58][Make EndLightingComputation() copy in to the top row of the octahedron][:lighting] [1:12:38][See copying in the light map][:lighting :run] [1:12:52][Temporarily make EndLightingComputation() copy in coloured values][:lighting] [1:13:05][See our correctly flipped copying in the light map][:lighting :run] [1:13:19][Make EndLightingComputation() copy in to the left and right columns of the octahedron][:lighting] [1:16:56][See copying in the light map, only missing the corners][:lighting :run] [1:17:10][Check our left–right vertical copies with the paper[ref title="Survey of Efficient Representations for Independent Unit Vectors" author="Zina H. Cigolle, Sam Donow, Daniel Evangelakos, Michael Mara, Morgan McGuire, Quirin Meyer" url=http://jcgt.org/published/0003/02/01/]][:lighting :research] [1:17:46][Make EndLightingComputation() copy in to the corners of our octahedron][:lighting] [1:19:30][See our fully filled light map][:lighting :run] [1:19:41][Let EndLightingComputation() populate the light map with real values][:lighting] [1:19:49][See our full light map, with no improvement to our discontinuity][:lighting :run] [1:21:05][Scour CompileZBiasProgram() for octahedral mapping bugs][:lighting :research :sampling] [1:24:11][Explicitly write out the OctMapCenterUV and OctExteriorUVDim initialisations in SampleLighting(), and continue to scour this function for bugs][:lighting :programming :research :sampling] [1:28:21][Fix OctMapInteriorUVDimC.y in SampleLighting()][:lighting :sampling] [1:29:43][Hit shader error][:lighting :run :sampling] [1:29:59][Fix typo in SampleLighting()][:lighting :sampling] [1:30:20][See different :lighting discontinuities][:run :sampling] [1:30:40][Continue to scour SampleLighting() for bugs][:lighting :research :sampling] [1:31:58][Take a close look at our :lighting discontinuities, and wonder if we have a blending error][:run] [1:33:58][Centred, Padded Lookup][:blackboard :mathematics] [1:34:51][Consider SampleLighting() to be doing a correct lookup][:lighting :research :sampling] [1:35:52][Toggle on the coloured octahedron in EndLightingComputation()][:"debug visualisation" :lighting] [1:36:25][Observe the :lighting discontinuities along with the light map][:"debug visualisation" :run] [1:37:41][Make CompileZBiasProgram() colour the world directly with light][:"debug visualisation" :lighting] [1:37:58][Observe the :lighting discontinuities with the world coloured with light][:"debug visualisation" :run] [1:39:31][Let EndLightingComputation() populate the light map with real values][:lighting] [1:39:37][Note that the :lighting discontinuities are not at copy points][:"debug visualisation" :run] [1:39:54][Toggle on the coloured octahedron in EndLightingComputation()][:"debug visualisation" :lighting] [1:39:58][Realise why we're not smoothly interpolating between adjacent, non-copied octants][:"debug visualisation" :lighting :run] [1:40:55][Toggle on linear blending in OpenGLChangeToSettings()][:lighting] [1:41:22][Admire our continuous :lighting][:"debug visualisation" :run] [1:41:28][Let EndLightingComputation() populate the light map with real values][:lighting] [1:41:54][Admire our continuous, yet popping :lighting][:"debug visualisation" :run] [1:42:24][Shoulder the :Owl of Shame] [1:42:50][Admire our :lighting][:owl :run] [1:43:07][Revert CompileZBiasProgram() to modulate the world's real colours with light][:lighting :owl] [1:43:21][Admire our :lighting, noting its directionality][:owl :run] [1:44:54][Make CompileZBiasProgram() colour the world directly with light][:"debug visualisation" :lighting :owl :programming] [1:44:59][Check out our :lighting seam][:"debug visualisation" :owl :run] [1:45:21][Toggle on the coloured octahedron in EndLightingComputation()][:"debug visualisation" :lighting :owl :programming] [1:45:30][Consider the seam to be along the wrapping border][:"debug visualisation" :lighting :owl :run] [1:45:39][Let EndLightingComputation() populate the light map with real values][:lighting :owl :programming] [1:45:50][Consider the seam not to be along the wrapping border][:"debug visualisation" :lighting :owl :run] [1:45:59][Toggle on the coloured octahedron in EndLightingComputation()][:"debug visualisation" :lighting :owl :programming] [1:46:00][Consider the seam to be straight down the middle of the pink][:"debug visualisation" :lighting :owl :run] [1:46:39][Let EndLightingComputation() populate the light map with real values][:lighting :owl :programming] [1:46:49][See the seam run in a different orientation][:"debug visualisation" :lighting :owl :run] [1:46:59][Toggle on the coloured octahedron in EndLightingComputation()][:"debug visualisation" :lighting :owl :programming] [1:47:06][Inspect our seam][:"debug visualisation" :lighting :owl :run] [1:47:58][Let EndLightingComputation() populate the light map with real values][:lighting :owl :programming] [1:48:13][Note the brightening as the character hops up][:"debug visualisation" :lighting :owl :run] [1:49:42][Try making SumLight() sample the :lighting from the direction you're pointing, ignoring the actual reflection vector][:owl :programming :sampling] [1:49:57][See no :lighting discontinuities][:"debug visualisation" :lighting :owl :run] [1:51:21][Revert SumLight() to use the reflection vector][:owl :programming :sampling] [1:52:02][Wonder if EndLightingComputation() is populating the octahedron incorrectly][:lighting :owl :research] [1:53:16][:Sampling Within Pixels][:blackboard] [1:55:08][Fix EndLightingComputation() to offset the light population by half a pixel][:lighting :owl :programming] [1:56:29][Still see the seam][:"debug visualisation" :lighting :owl :run] [1:56:49][Toggle EndLightingComputation() between offsetting the light population and not, to see difference but no improvement][:lighting :owl :programming :run] [1:58:29][Q&A][:speech] [1:59:01][@somebody_took_my_name][Q: Can you vary the light height to see its impact?][:lighting] [1:59:29][@somebody_took_my_name][Either way][:lighting] [1:59:30][@uplinkcoder][Q: Can you draw in the light probe positions?][:lighting] [2:00:15][Make EndLightingComputation() draw the light probes, introducing IsInDebugVoxDim()][:"debug visualisation" :lighting] [2:07:18][See our misplaced light probes][:"debug visualisation" :lighting :run] [2:07:39][Fix the position of the light probe drawing in EndLightingComputation()][:"debug visualisation" :lighting] [2:09:52][See our light probes, and consider the brightening to be due to a Z-discontinuity][:"debug visualisation" :lighting :run] [2:11:36][@snubbykins][Q: Should you gutter copy from the opposite / flipped sides of the octal mapping so the bilinear blend will blend correctly?[ref title="Survey of Efficient Representations for Independent Unit Vectors" author="Zina H. Cigolle, Sam Donow, Daniel Evangelakos, Michael Mara, Morgan McGuire, Quirin Meyer" url=http://jcgt.org/published/0003/02/01/]][:lighting] [2:12:50][Make UpdateAndRenderWorld() vary the height of the light][:lighting] [2:14:35][See no light popping][:lighting :run] [2:14:48][Increase the height variance of the light in UpdateAndRenderWorld()][:lighting] [2:15:02][See light popping as the light passes through probes][:lighting :run] [2:18:48][Remove the light height varying code][:lighting] [2:18:58][Call it for today][:speech] [/video]