[video output=day408 member=cmuratori stream_platform=twitch stream_username=handmade_hero project=code title="Finishing Debugging Volume Textures" vod_platform=youtube id=aRQ4aSUA5Gs annotator=Miblo] [0:03][Recap and set the stage for the day] [0:38][Fix the monitor's colour] [1:55][Resume our investigations into the volume texture lookup] [4:46][Determine to use structured art to verify that we are transmitting the correct values] [7:58][handmade_render_group.cpp: Make OutputLightingTextures() write a monotonically increasing value into the lookup sampler] [10:30][handmade_opengl.cpp: Make CompileZBiasProgram() use that value directly] [13:12][handmade_render_group.cpp: Temporarily disable OutputTextureDebug()] [13:55][Run the game and see nothing] [15:03][handmade_world_mode.cpp: Prevent UpdateAndRenderWorld() from calling OutputLighting()] [16:32][Run the game and hunt for a key binding to capture a frame] [18:53][Capture a frame and see that the lookup sampler contains all 0] [20:18][Run the game, run PushLighting() and capture a frame to see our expected values in the lookup sampler] [21:55][handmade_render_group.cpp: Make OutputLightingTextures() set the fragment shader's lighting texels and colour to known values] [25:16][Capture a frame, but find that the compiler has optimised out the lighting texels and colour] [26:33][handmade_opengl.cpp: Investigate why the texelFetch in CompileZBiasProgram() is not using our structured art, with a few words on graphics programming] [31:13][handmade_opengl.cpp: Verify VoxP in CompileZBiasProgram() by colouring the voxels by their address] [32:21][Run the game to see our colour-coded representation of the voxel lookup] [33:10][handmade_opengl.cpp: Make CompileZBiasProgram() set the colour from the VoxP after flooring] [33:41][Run the game to see that this is still as expected] [34:48][handmade_opengl.cpp: Make CompileZBiasProgram() perform texelFetch() on our verified values] [36:59][Run the game and still see black] [37:28][Consult the OpenGL Shading Language Specification for texelFetch()[ref site="Khronos" page="The OpenGL Shading Language 4.40" url=https://khronos.org/registry/OpenGL/specs/gl/GLSLangSpec.4.40.pdf]] [44:08][handmade_opengl.cpp: Initialise LightI as a uint, and continue to wonder why we are not successfully fetching from the LookupSampler] [50:48][handmade_opengl.cpp: Try setting the UseLightC to individual colours from the LookupSampler, to see exactly what texelFetch() returns] [54:39][Run the game to see that the alpha channel unexpectedly is a high value before submitting the texture] [56:03][Reflect on our findings, that texelFetch() is returning 0, 0, 0, 1] [1:00:54][@macielda][Maybe up your level of debug message notifications?] [1:01:12][handmade_opengl.cpp: Print out all of the debug messages] [1:03:32][@bestalloys][3rd comment: https://stackoverflow.com/questions/26770216/why-is-texelfetch-always-returning-0-for-a-1d-single-channel-texture] [1:07:05][handmade_opengl.cpp: Make OpenGLChangeToSettings() set GL_TEXTURE_MIN_FILTER and GL_TEXTURE_MAG_FILTER to GL_NEAREST] [1:11:47][Run the game to see that this totally fixed it, and wonder why texelFetch() applied filtering] [1:15:44][Consult the OpenGL Specification for texelFetch()[ref site="Khronos" page="OpenGL 4.4 (Core Profile)" url="https://khronos.org/registry/OpenGL/specs/gl/glspec44.core.pdf"]] [1:19:02][Read about Texture Completeness[ref site="Khronos" page="OpenGL 4.4 (Core Profile)" url="https://khronos.org/registry/OpenGL/specs/gl/glspec44.core.pdf"]] [1:23:05][handmade_opengl.cpp: Enable CompileZBiasProgram() to use our structured art fetched from the LookupSampler] [1:32:53][handmade_opengl.cpp: Enable CompileZBiasProgram() to sample our real lighting values] [1:34:01][Run the game to see that we are getting the colours we'd expect] [1:34:45][handmade_opengl.cpp: Make the lighting grid more coarse] [1:36:17][Run the game and note that we are not covering all the space with light] [1:37:18][handmade_opengl.cpp: Introduce SumVoxelLight() to enable CompileZBiasProgram() to sample from neighbouring voxels] [1:46:03][Run the game to see that running fast] [1:47:48][handmade_opengl.cpp: Make CompileZBiasProgram() modulate the texture colours by the lighting values] [1:48:29][Run the game to see our lit scene] [1:48:51][handmade_opengl.cpp: Enable CompileZBiasProgram() to weight the lighting values by their proximity] [1:52:24][Run the game to see that we don't have dense enough lighting coverage] [1:52:48][handmade_opengl.cpp: Make the lighting grid more fine grained] [1:53:09][Run the game to see our more smoothly lit scene] [1:55:01][handmade_opengl.cpp: Change the coarseness of the lighting grid] [1:56:49][Q&A][:speech] [1:57:14][@bestalloys][Why no indentation on the shader code?] [1:58:29][@butwhynot1][Have you tried CUDA? Do you think it's a reasonable way to do GPU programming? AMD is trying to get a CUDA compatible compiler so it could be usable on both vendors soon] [2:00:28][@4bitlightning][Could you try to use #include and the multi line strings together for the shader code?] [2:01:20][@poohshoes][I've just started a project and am working through the setup on Day 002. You had set up a PatBlt on WM_PAINT to alternate black and white. If I made no mistakes then it doesn't work on windows 10, I'm instead getting all white and if I drag the window around, the new part of the window becomes black? Do you know if there are any caveats for windows 10 I should be worried about? Should I keep going or is it important to get this working exactly the same?] [2:02:19][@nxsy][Do you have any suggestions on how to start going about voxelising more complex 3D meshes rather than simpler geometric shapes? Break them up into simpler geometric version / LOD meshes first? Should each mesh be pre-voxelised, or do you need to recalculate relative to the world / view position (and possibly distance from camera)?] [2:04:08][@nxsy][Not necessarily doing it on the GPU, but to provide what the GPU needs to do this sort of lighting with more complex meshes] [2:06:54][Blackboard: 2D rasterization] [2:08:16][Blackboard: Conservative rasterization] [2:12:17][Blackboard: Faster voxelization, using Reyes rendering[ref site="Wikipedia" page="Reyes rendering" url="https://en.wikipedia.org/wiki/Reyes_rendering"]] [2:17:24][Recommend crawling references[ref site="CiteSeerX" page="Interactive Indirect Illumination Using Voxel Cone Tracing" url="http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.225.5903"]][:research] [2:22:29][Close down the stream][:speech] [/video]