[video member=cmuratori stream_platform=twitch stream_username=handmade_hero project=code title="Converting Depth Peel Data to Lighting Data" vod_platform=youtube id=7zSz85fsok0 annotator=Miblo] [0:08][Recap and set the stage for the day] [2:05][Consider how to resolve the issue that we're only computing the lighting on the topmost of four depth peels] [5:41][Mention that multigrid lighting may not work out] [9:29][Run the game to see the current state of the lighting system] [12:31][handmade_opengl.cpp: Fix "Minor copy-paste error in handmade_opengl.cpp" issue[ref site="GitHub" page="HandmadeHero/cpp Issues" url="https://github.com/HandmadeHero/cpp/issues"]] [14:13][handmade_opengl.cpp: Prevent ComputeLightTransport() from pulling the emit colour from the DepthPeelResolveBuffer] [15:03][Run the game to see the existing fake lighting] [15:22][handmade_opengl.cpp: Enable ComputeLightTransport() to bind lighting textures that come from the depth peel] [20:00][handmade_opengl.cpp: Introduce CompileDepthPeelToLighting() based on CompilePeelComposite()] [29:16][handmade_opengl.cpp: Make CompilePeelComposite() compute the FrontEmit, BackEmit, SurfaceColor and NP] [32:50][handmade_opengl.cpp: Change CompilePeelComposite() to use the layout(location) syntax and take an opengl_program_common] [37:55][Run the game and see bright white] [38:12][Research the OpenGL Layout qualifier[ref site="Khronos" page="The OpenGL Shading Language 3.30" url="https://khronos.org/registry/OpenGL/specs/gl/GLSLangSpec.3.30.pdf"][ref site=OpenGL page="Layout Qualifier (GLSL)" url=https://www.khronos.org/opengl/wiki/Layout_Qualifier_(GLSL)]] [42:35][handmade_opengl.cpp: Revert CompilePeelComposite() to not use the layout(location) syntax, and make all the programs explicit] [45:20][handmade_opengl.cpp: Make OpenGLCreateProgram() reset the SamplerCount, and introduce OpenGLLinkSamplers()] [50:15][Run the game to see what we had running before] [50:31][handmade_opengl.cpp: Make all the shader programs use OpenGLLinkSamplers(), as a partial way towards layout(location)] [56:00][handmade_opengl.cpp: Make UseProgramBegin() set up all of the samplers for the program] [56:59][Run the game to see that we're back to normal, view the beautiful depth buffer and investigate why we are seeing it] [1:01:07][handmade_opengl.cpp: Hard set CompileZBiasProgram() to write red into BlendUnitColor\[0\]] [1:01:43][Run the game to see that it isn't all red, and determine that some other phase must be wrong] [1:03:13][handmade_opengl.cpp: Make CompileResolveMultisample() pass the samplers to OpenGLLinkSamplers() in the correct order, and run the game to see that we're back to normal] [1:03:35][handmade_opengl.h and handmade_opengl.cpp: Remove peel_composite_program, final_stretch_program and multigrid_light_up_program, and their corresponding OpenGLProgramBegin() functions] [1:06:09][Run the game to see that we're still fine] [1:06:15][handmade_opengl.cpp: Try and force CompileResolveMultisample() to use layout(location = 8)] [1:10:45][handmade_opengl.cpp: Toggle back on the depth peel importing in ComputeLightTransport()] [1:11:17][Run the game to see that this does appear to have imported the lighting values] [1:13:52][Determine to bounce the light around] [1:17:30][Blackboard: Multigrid light transport] [1:20:42][Blackboard: The multigrid dream] [1:27:54][handmade_opengl.cpp: Consider what we can do in CompileMultiLightDown()] [1:29:26][Blackboard: Bouncing light] [1:30:21][Blackboard: Figuring out how aligned light sources are] [1:31:02][handmade_opengl.cpp: Make CompileMultiLightDown() compute the facing term, the distance between lights and the falloff[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"]] [1:34:45][Note that we're not reconstructing the light positions] [1:35:19]["That's gonna be a whole bailiwick in and of itself"][quote 586] [1:36:08][handmade_opengl.cpp: Make ReconstructPosition() in CompileMultiLightDown() use UV] [1:36:52][Run the game, crash in ExecuteBrain() and investigate why] [1:39:02][win32_handmade.cpp: Reduce the resolution in WinMain() and run the game to see that that looks better] [1:41:06][handmade_opengl.cpp: Make CompileZBiasProgram() create a white light and run the game to see what's happening] [1:42:49][handmade_opengl.cpp: Investigate why we are not seeing any colour contribution from textures] [1:44:52][handmade_opengl.cpp: Fix TransferLight() in CompileZBiasProgram() to use the Falloff, and run the game to see colour contributon] [1:45:13][handmade_opengl.cpp: Make TransferLight() in CompileZBiasProgram() transfer based on the facing direction and run the game to see that that is not working] [1:47:43][handmade_opengl.cpp: Investigate why the facing direction isn't producing the expected transfer] [1:52:44][handmade_opengl.cpp: Make CompileMultiGridDown() write the reconstructed normal into our second channel, and run the game to inspect that channel] [1:55:27][handmade_opengl.cpp: Make ReconstructNormal() in CompileMultiGridDown() overwrite the Z with 0 and run the game to see that upward facing components still contain green] [1:57:02][handmade_opengl.cpp: Make CompileDepthPeelToLighting() correctly compute the Nx and Ny and run the game to see better values] [1:57:48][handmade_opengl.cpp: Make ReconstructNormal() in CompileMultiGridDown() use the computed Z and run the game with more confidence that the normals are plausible] [1:58:28][handmade_opengl.cpp: Continue investigating why we're not getting any light transference] [2:00:36][handmade_opengl.cpp: Make CompileZBiasProgram() output the negative inner product of the surface normals] [2:01:20][Run the game to see that negative product] [2:01:39][handmade_opengl.cpp: Make CompileZBiasProgram() output the non-negative inner product of the surface normals] [2:01:47][Run the game to see this non-negative product] [2:04:06][Q&A][:speech] [2:04:50][@Miblo][Could some of our lighting code end up being used by the audio system to figure out where and how obstructed / reflected sound sources are?] [2:06:01][@lorto6][Try 1 - clamp()!] [2:06:27][Blackboard: Clamping normals] [2:08:03][@asafgartner][Should you add a fake ceiling for lighting (or a non-fake ceiling based on the floor above the current one)?] [2:08:48][@xyane][Not entirely related to today's stream, but will you perhaps use something like a pipeline state object for binding resources? I personally find that I get a few annoying debug messages telling me about resource hazards and I'd like a better way than randomly throwing in null binds in the middle of my code and would like a better way to bind resources to minimize API calls, and would love to see a good PSO implementation] [2:11:34][We are done for today][:speech] [/video]