[video output=day364 member=cmuratori stream_platform=twitch stream_username=handmade_hero project=code title="Enabling the OpenGL Depth Buffer" vod_platform=youtube id=m8trVjY2WgI annotator=Miblo]
[1:32][Run the game, recap and set the stage for the day]
[4:55][Blackboard: Using the Z-buffer to sort ground tiles]
[6:35][Blackboard: Slanting the upright sprites to make them occlude each other properly]
[13:55][Run the game and illustrate why this scheme will be important for debugging purposes]
[14:08]["We're going to write some code and hope that it's right"][quote 550]
[14:56][Determine to turn on the Z-buffer[ref
    site="Handmade Hero"
    page="Day 358 - Introduction to Depth Buffers"
    url="https://hero.handmade.network/episode/code/day358"]]
[15:36][handmade_opengl.cpp: Make OpenGLRenderCommands() enable GL_DEPTH_TEST and call glDepthMask()[ref
    site="docs.GL"
    page="glDepthMask"
    url="http://docs.gl/gl2/glDepthMask"] and glColorMask()]
[21:40][win32_handmade.cpp: Make Win32SetPixelFormat() set cDepthBits[ref
    site="MSDN"
    page="PIXELFORMATDESCRIPTOR structure"
    url="https://msdn.microsoft.com/en-us/library/windows/desktop/dd368826"]]
[25:00][win32_handmade.cpp: Make Win32SetPixelFormat() specify the colour bits[ref
    site="Khronos"
    page="WGL_ARB_pixel_format"
    url="http://developer.download.nvidia.com/opengl/specs/WGL_ARB_pixel_format.txt"]]
[28:39][Run the game, see nothing on the screen and investigate why]
[29:24][handmade_opengl.cpp: Make OpenGLRenderCommands() pass GL_DEPTH_BUFFER_BIT to glClear()]
[31:56][Run the game to see that we're getting Z-tested drawing]
[32:42][Blackboard: Preventing fully transparent pixels from entering the Z-buffer]
[36:25][handmade_opengl.cpp: Make OpenGLRenderCommands() enable and call glAlphaFunc()[ref
    site="docs.GL"
    page="glAlphaFunc"
    url="http://docs.gl/gl2/glAlphaFunc"]]
[38:24][handmade_opengl.cpp: Temporarily make glAlphaFunc() operate for alpha values greater than 0]
[39:04][Blackboard: No blending if sprites happen to be drawn in the wrong order]
[42:06][handmade_opengl.cpp: Make OpenGLRenderCommands() call glDepthFunc()[ref
    site="docs.GL"
    page="glDepthFunc"
    url="http://docs.gl/gl2/glDepthFunc"]]
[43:19][Run the game to see that the drawing order is being respected, but that the sort is unstable]
[46:05][Determine to process the Z-values[ref
    site="Unspecified Behaviour"
    page="Calculating the gluPerspective matrix and other OpenGL matrix maths"
    url="https://unspecified.wordpress.com/2012/06/21/calculating-the-gluperspective-matrix-and-other-opengl-matrix-maths/"]]
[50:46][Blackboard: Near and Far Clip (Planes)]
[53:50][Blackboard: Mapping the Z-values in the correct direction to the -1 to 1 range]
[56:27][Blackboard: Determining the structure of the mapping function]
[59:08][Blackboard: Solve these equations for a and b]
[1:02:11][Blackboard: Verify these equations]
[1:08:49][Blackboard: Solve the equations again, passing in the correct values]
[1:17:44][handmade_math.h: Make PerspectiveProjection() compute d and e to pass to the matrix]
[1:19:02][Run the game to see the finer grained Z-fighting]
[1:20:03][handmade_render_group.cpp: Enable PushBitmap() to increase the sprites' height relative to their Z]
[1:22:52][Run the game to see the slanted sprites, and consider why we must take the camera into account for shearing]
[1:25:03][handmade_render_group.cpp: Make PushBitmap() also modify the sprites' Y and X values]
[1:27:21][Consider using the camera's relative position to compute these modifications]
[1:28:48][Q&A][:speech]
[1:29:20][@ratchetfreak][When adjusting the sprite like that, don't you need to interpolate the texture coordinates in screenspace instead of clipspace (the default)?]
[1:30:29][@macielda][What is Alpha to Coverage? Any good references on that?]
[1:31:48][@k1ng_k3v1n][Would an orthogonal projection matrix be applicable for your game?]
[1:32:19][@sharlock93][Is the -n and -f because OpenGL has the camera on the negative -z?]
[1:33:06][@magik603][Why are you using legacy OpenGL?]
[1:34:49][@cvaucher][Do you typically use an infinite far plane for increased precision? Shawn McGrath mentioned it in his stream awhile back]
[1:36:20][@macielda][Would it be simpler to use Orthographic transforms for upright objects? Are you not simply undoing the Perspective Projection there?]
[1:37:28][@pepevel][Would it be possible to use a shader to do the Z-buffer rendering?]
[1:40:17][@sharlock93][So the near and far plane are linearly mapped. I have read somewhere where the mapping is not linear, in which case do we not make them linear?]
[1:43:13][Blackboard: Accounting for the -z in our coefficients]
[1:48:15][Consult the OpenGL spec[ref
    site="OpenGL"
    page="The OpenGL Graphics System: A Specification (v2.0)"
    url="https://hippo.nipax.cz/docs/glspec20.pdf"]]
[1:52:24][@sharlock93][Oh yeah, sorry, I mixed two things up]
[1:52:34][Blackboard: Computing a and b, accounting for the -z]
[2:02:30][handmade_math.h: Try to make PerspectiveProjection() compute the non-perspective corrected terms for orthographic]
[2:05:23][End it there][:speech]
[/video]
