[video output=day369 member=cmuratori stream_platform=twitch stream_username=handmade_hero project=code title="Introduction to Vertex and Fragment Shaders" vod_platform=youtube id=GtNvxxl3AK4 annotator=Miblo] [0:01][Recap and set the stage for the day] [2:21][Blackboard: Shaders[ref site="Handmade Hero Episode Guide" page="Filling Rotated and Scaled Rectangles" url=https://hero.handmade.network/episode/code/day092][ref site="Handmade Hero Episode Guide" page="Packing Pixels for the Framebuffer" url=https://hero.handmade.network/episode/code/day117][ref site="Handmade Hero Episode Guide" page="Passing Rotation and Shear to the Renderer" url=https://hero.handmade.network/episode/code/day275]] [3:22][Blackboard: How hardware does pixel processing vs how we did it in software with SIMD] [7:38][Blackboard: Processing a 4x4 square of 16 pixels at a time, also called "warp"] [10:56][Blackboard: Writing a pixel shader, with the understanding that everything operates on many pixels at once] [15:55][Blackboard: Leveraging the capabilities of the hardware] [19:49][Blackboard: An example illustrating the need to understand the ramifications of operating wide] [24:50]["You're going down"][quote 556] [27:27][Blackboard: "Fragment" shader] [30:15][Blackboard: "Vertex" shader] [33:36][handmade_opengl.cpp: Make OpenGLCreateProgram() check GL_LINK_STATUS and GL_COMPILE_STATUS rather than GL_VALIDATE_STATUS[ref site="Khronos" page="glcorearb.h" url="https://www.khronos.org/registry/OpenGL/api/GL/glcorearb.h"]] [35:48][Run the game and successfully receive compile errors] [36:08][Note that Martins pointed out that multiline strings are supported in Visual Studio 2013[ref site="cppreference" page="string literal" url="http://en.cppreference.com/w/cpp/language/string_literal"]] [39:37][handmade_opengl.cpp: Introduce VertexCode and FragmentCode here docs in OpenGLInit()] [41:09][Research the Core Language (GLSL) versioning[ref site="OpenGL Wiki" page="Core Language (GLSL)" url="https://www.khronos.org/opengl/wiki/Core_Language_(GLSL"]] [44:06][handmade_opengl.cpp: Set #version 130 in HeaderCode and run the game] [44:33][The OpenGL Shading Language 1.50 Quick Reference Card[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"]] [50:49][handmade_opengl.cpp: Sketch out a shader in VertexCode] [53:20][The Built-in Inputs, Outputs and Constants] [56:22][handmade_opengl.cpp: Enable the VertexCode to take the Transform, using a uniform] [57:39][handmade_opengl.cpp: Start to enable OpenGLRenderCommands() to pass Transform to the shader] [59:52][Blackboard: How the shader compiler references a uniform] [1:02:47][handmade_opengl.h: Add GLSLTransformID to open_gl] [1:03:39][handmade_opengl.cpp: Start to sketch out a shader in FragmentCode in conjunction with the OpenGL Shading Language 1.50 Quick Reference Card] [1:06:26][Note that there is no colour value in the fragment language's gl_FragDepth] [1:08:57][handmade_opengl.cpp: Continue sketching out the FragmentCode] [1:10:03][handmade_opengl.cpp: Enable OpenGLRenderCommands() to setup a uniform matrix using glUniformMatrix4()] [1:13:31][handmade_opengl.cpp: Make OpenGLRenderCommands() call glUseProgram() in order to actually run the shader] [1:14:59][win32_handmade.cpp: Pull glGetUniformLocation(), glUniform4fv() and glUniformMatrix4fv() from glcorearb.h] [1:19:02][handmade_opengl.cpp: Correctly declare main() in the shader code and run] [1:21:19][Read about glGetProgram()[ref site=docs.GL page="glGetProgram" url=http://docs.gl/gl3/glGetProgram]] [1:21:42][handmade_opengl.cpp: Make OpenGLCreateProgram() only check GL_LINK_STATUS and run the game to see that it works] [1:22:28][handmade_opengl.cpp: Make VertexCode set the InputVertex.w to 1.0 and run the game to see that the vertex shader is running] [1:23:32][handmade_opengl.cpp: Enable VertexCode to perform a ZTransform] [1:25:51][Run the game to see that we're getting the biasing we want] [1:26:32][handmade_opengl.cpp: Rewrite the VertexCode more instructively] [1:28:41][Run the game and reiterate what the VertexCode is doing, with a few words on its efficiency] [1:30:17][handmade_opengl.cpp: Determine to enable FragmentCode to operate on textures] [1:33:45][Blackboard: Variables in the fragment shader: "flat", "noperspective" and "smooth"] [1:37:56][handmade_opengl.cpp: Enable the FragmentCode to sample from textures, using a uniform] [1:41:39][Run the game and unexpectedly receive no error] [1:41:50][handmade_opengl.cpp: Enable VertexCode to pass FragUV and FragColor out to the FragmentCode] [1:45:03][Run the game] [1:45:08][handmade_opengl.cpp: Make VertexCode correctly set FragUV using gl_TexCoord\[0\].xy] [1:47:51][Run the game in the belief that we're passing down everything we need] [1:48:51][handmade_opengl.cpp: Make OpenGLRenderCommands() set a TextureSamplerID to pass to the FragmentCode shader] [1:52:53][Research glUniform[ref site=docs.GL page="glUniform" url=http://docs.gl/gl3/glUniform]] [1:54:14][win32_handmade.cpp: Pull glUniformli() from glcorearb.h] [1:56:17][Q&A][:speech] [1:56:58][Fuss with OBS] [1:59:45][@rbdjellyfish][Check your global settings] [2:01:17][@0xdeadbeefh][Maybe just have one scene? So it can't switch] [2:02:08][@rooctag][Now that we've gone OpenGL, do you still think the RaspberryPi option is still on the list?] [2:02:59][@macielda][Would you show us the code for what you have done in the last 2-4 minutes?] [2:03:16][handmade_opengl.cpp: Recap the FragmentCode here doc, and setting the TextureSamplerID] [2:06:22][@wgg25][gl_TexCoord is an output from the vertex shader, which is why everything is black, you should use gl_MultiTexCoord0 (no brackets)] [2:06:40][handmade_opengl.cpp: Make the VertexCode use gl_MultiTexCoord0 to specify the FragUV, and run the game to see that it works] [2:07:09][handmade_opengl.cpp: Remove the setting of TexSample.a to 1.0 from the FragmentCode, and run the game to see what we expect to get] [2:09:12][@miblo][Are you receiving the Qs from HMN IRC/#hero? Your usual invocation of !qa didn't appear there today] [2:09:41][@rooctag][You mentioned the new assets will not be rectangular like the current assets. Do we need to update the asset pipeline for this?] [2:11:02][@abarishu][Are we completely dropping support for the software renderer now?] [2:11:36][@rooctag][I mean the hero head vs body vs cape are all the same shape] [2:11:59][@macielda][Can you explain with a little bit more detail about how the Z-bias thing works? I'm not sure I understand it] [2:12:12][Blackboard: How the Z-bias prevents sprites from intersecting] [2:18:01][@abarishu][So we are going to implement some form of Z-buffer in software?] [2:18:19][@macielda][The key part for me was that the Z is only used for the ZBuffer and the W does the perspective divide, thanks] [2:19:20][Go ahead and close it down with the determination to upgrade the graphics card][:speech] [/video]