The main steps are handled in the RenderSceneCB() function. After setting up a few uniform variables for the shaders, it calls the 3 functions in sequence:
RenderSceneIntoDepth(); glEnable(GL_STENCIL_TEST); RenderShadowVolIntoStencil(); RenderShadowedScene();
You can find the definitions of each function in the tutorial-they're not that long.
First the entire scene is rendered (a box and a floor quad) depth-only.
Then the shadow-volumes are rendered which populates the stencil buffer based on when the depth-test fails for front and back faces. Cool. Makes sense.
The last bit confuses me. Take a look at the RenderedShadowScene() function:
void RenderShadowedScene()
{
glDrawBuffer(GL_BACK);
glDepthMask(GL_FALSE);
glStencilFunc(GL_EQUAL, 0x0, 0xFF);
m_LightingTech.Enable();
m_pointLight.AmbientIntensity = 0.0f;
m_pointLight.DiffuseIntensity = 0.8f;
m_LightingTech.SetPointLights(1, &m_pointLight);
m_pGroundTex->Bind(GL_TEXTURE0);
Pipeline p;
p.SetPerspectiveProj(m_persProjInfo);
p.SetCamera(m_pGameCamera->GetPos(), m_pGameCamera->GetTarget(), m_pGameCamera->GetUp());
p.WorldPos(m_boxPos);
p.Rotate(0, m_scale, 0);
m_LightingTech.SetWVP(p.GetWVPTrans());
m_LightingTech.SetWorldMatrix(p.GetWorldTrans());
m_box.Render();
p.Scale(10.0f, 10.0f, 10.0f);
p.WorldPos(0.0f, 0.0f, 0.0f);
p.Rotate(90.0f, 0.0f, 0.0f);
m_LightingTech.SetWVP(p.GetWVPTrans());
m_LightingTech.SetWorldMatrix(p.GetWorldTrans());
m_quad.Render();
}
Mostly the real meat and potatoes happens in the first two calls I think. glDrawBuffer(GL_BACK) and glDepthMask(GL_FALSE). From my understanding. I have never scene the glDrawBuffer(GL_BACK) call before and the tutorial doesn't explain it. As for glDepthMask, my understanding here is that this means the depth test is still active, but writing new values does not occur.
Apart from not knowing what the point of glDrawBuffer(GL_BACK) is, I don't understand how the depth-test can work here. If the depth test is enabled, we should get Z-fighting, since "RenderSceneIntoDepth();" already filled the depth buffer. On the other hand, if we disable the depth buffer, than the pixels might be rendered out of order.
So confused...