[video member=cmuratori stream_platform=twitch stream_username=handmade_hero project=code title="Trying Multisampled Depth Peels" vod_platform=youtube id=vOre9E5hJzc annotator=Miblo] [0:28][Recap and set the stage for the day] [1:46][Run the game and demo the aliasing around our geometric primitives] [6:28][Describe the two processes at play: Artistic and Analytical Antialiasing] [10:55][Consider our two options for handling this: Multisampling and Conservative Rasterization[ref site="Khronos" page="NV_conservative_raster" url="https://www.khronos.org/registry/OpenGL/extensions/NV/NV_conservative_raster.txt"]] [18:09][handmade_opengl.cpp: Review our depth peeling for sprite rendering] [21:44][handmade_opengl.cpp: Determine to enable OpenGLChangeToSettings() to perform multisampling only on the front-most depth peel buffer] [26:20][handmade_opengl.cpp: Consider how to perform the composite] [31:02][handmade_opengl.cpp: Add ResolveHandle to opengl_framebuffer, and introduce SetDefaultFramebufferTextureParameters() and FramebufferTexImage()] [41:02][handmade_opengl.cpp: Enable CreateFramebuffer() to create a ResolveFramebuffer for multisampling] [43:27][Run the game to make sure that it works okay] [43:38][handmade_opengl.cpp: Enable the multisampling path] [47:29][Note that we cannot render from a multisampled texture as if it was a regular texture] [49:00][handmade_opengl.cpp: Look into making OpenGLRenderCommands() conditionally bind depending on whether or not we're multisampling] [49:54][handmade_opengl.cpp: Back out our changes and instead just create two framebuffers: one multisampled, one not] [53:13][handmade_opengl.cpp: Make OpenGLRenderCommands() set the correct PeelBuffer for multisampling] [54:38][handmade_opengl.cpp: Introduce GetDepthPeelReadBuffer()] [56:23][Run the game to see a black screen, as expected] [56:43][handmade_opengl.cpp: Enable OpenGLRenderCommands() to resolve our framebuffers] [1:00:12][Run the game to see that everything appears at first glance to be working, but is a lot slower than we'd like] [1:03:23][Consider using conservative rasterization] [1:05:33][Determine to do everything multisampled, consulting the OpenGL documentation for sampler2DMS[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][ref site="OpenGL Registry" page="The OpenGL Shading Language" url=https://khronos.org/registry/OpenGL/specs/gl/GLSLangSpec.1.50.pdf]] [1:14:26][When evaluating a given sample from a multisampled buffer, we want to get its corresponding depth sample[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:17:52][Note that conservative rasterization would definitely solve our problem] [1:19:31][Consult the OpenGL Hardware Database to see which cards support GL_NV_conservative_raster[ref site="OpenGL Hardware Database" page="GL_NV_conservative_raster" url=http://opengl.gpuinfo.org/gl_listreports.php?listreportsbyextension=GL_NV_conservative_raster] and GL_INTEL_conservative_rasterization[ref site="OpenGL Hardware Database" page="GL_INTEL_conservative_rasterization" url=http://opengl.gpuinfo.org/gl_listreports.php?listreportsbyextension=GL_INTEL_conservative_rasterization]] [1:20:44][Run the game and consider what's causing the slowness] [1:22:37][handmade_opengl.cpp: Toggle back to non-multisampling, run the game to see that the frame rate is fine, and continue considering the slowness] [1:24:37][handmade_opengl.cpp: Determine to enable the multisampling path to pick the closest depth value[ref site=docs.GL page=glBlitFramebuffer url=http://docs.gl/gl3/glBlitFramebuffer][ref site="OpenGL Registry" page="OpenGL 3.2 (Core Profile)" url=https://khronos.org/registry/OpenGL/specs/gl/glspec32.core.pdf]] [1:30:49][handmade_opengl.cpp: Introduce ResolveMultisample()] [1:38:31][handmade_opengl.cpp: Introduce CompileResolveMultisample() shader] [1:45:49][Begin to consider the dilemma surrounding the averaging process] [1:47:48][handmade_opengl.cpp: Fix compile errors] [1:48:53][Q&A][:speech] [1:49:46][@flyingsolomon][I think it will be useful to bind a key to topmost window as there is a key to full screen, then you will not have to resize your editor for live code editing. Also, since I bound the ` key to -> in my editor I'm a very happy panda, warm recommendations] [1:50:27][@ravarix][Why s32 for the count, instead of u32?] [1:51:03][@dragoonx6][Could you up the bitrate? It's really hard to watch when there's too much movement on the screen. It gets all blurry and pixelated. Not exaggerating when I say it makes my eyes watery] [1:52:50][Wrap things up with a plug of the episode guide's new search feature[ref site="Handmade Hero" page="Episode Guide" url="https://hero.handmade.network/episodes"]][:research] [/video]