| 98 | */ |
| 99 | |
| 100 | bool DeferredPhongLightingPass::Process(const SceneData& sceneData, unsigned int firstWorkTexture, unsigned secondWorkTexture) const |
| 101 | { |
| 102 | NazaraAssert(sceneData.viewer, "Invalid viewer"); |
| 103 | NazaraUnused(secondWorkTexture); |
| 104 | |
| 105 | m_workRTT->SetColorTarget(firstWorkTexture); |
| 106 | Renderer::SetTarget(m_workRTT); |
| 107 | Renderer::SetViewport(Recti(0, 0, m_dimensions.x, m_dimensions.y)); |
| 108 | |
| 109 | Renderer::SetTexture(0, m_GBuffer[0]); |
| 110 | Renderer::SetTextureSampler(0, m_pointSampler); |
| 111 | |
| 112 | Renderer::SetTexture(1, m_GBuffer[1]); |
| 113 | Renderer::SetTextureSampler(1, m_pointSampler); |
| 114 | |
| 115 | Renderer::SetTexture(2, m_GBuffer[2]); |
| 116 | Renderer::SetTextureSampler(2, m_pointSampler); |
| 117 | |
| 118 | Renderer::SetTexture(3, m_depthStencilTexture); |
| 119 | Renderer::SetTextureSampler(3, m_pointSampler); |
| 120 | |
| 121 | Renderer::SetClearColor(Color::Black); |
| 122 | Renderer::Clear(RendererBuffer_Color); |
| 123 | |
| 124 | RenderStates lightStates; |
| 125 | lightStates.dstBlend = BlendFunc_One; |
| 126 | lightStates.srcBlend = BlendFunc_One; |
| 127 | lightStates.blending = true; |
| 128 | lightStates.depthBuffer = false; |
| 129 | lightStates.depthWrite = false; |
| 130 | |
| 131 | // Directional lights |
| 132 | if (!m_renderQueue->directionalLights.empty()) |
| 133 | { |
| 134 | Renderer::SetRenderStates(lightStates); |
| 135 | Renderer::SetShader(m_directionalLightShader); |
| 136 | m_directionalLightShader->SendColor(m_directionalLightShaderSceneAmbientLocation, sceneData.ambientColor); |
| 137 | m_directionalLightShader->SendVector(m_directionalLightShaderEyePositionLocation, sceneData.viewer->GetEyePosition()); |
| 138 | |
| 139 | for (auto& light : m_renderQueue->directionalLights) |
| 140 | { |
| 141 | m_directionalLightShader->SendColor(m_directionalLightUniforms.locations.color, light.color); |
| 142 | m_directionalLightShader->SendVector(m_directionalLightUniforms.locations.factors, Vector2f(light.ambientFactor, light.diffuseFactor)); |
| 143 | m_directionalLightShader->SendVector(m_directionalLightUniforms.locations.parameters1, Vector4f(light.direction)); |
| 144 | |
| 145 | Renderer::DrawFullscreenQuad(); |
| 146 | } |
| 147 | } |
| 148 | |
| 149 | // Point lights/Spot lights |
| 150 | if (!m_renderQueue->pointLights.empty() || !m_renderQueue->spotLights.empty()) |
| 151 | { |
| 152 | // http://www.altdevblogaday.com/2011/08/08/stencil-buffer-optimisation-for-deferred-lights/ |
| 153 | lightStates.cullingSide = FaceSide_Front; |
| 154 | lightStates.stencilTest = true; |
| 155 | lightStates.stencilDepthFail.back = StencilOperation_Invert; |
| 156 | lightStates.stencilDepthFail.front = StencilOperation_Invert; |
| 157 | lightStates.stencilFail.back = StencilOperation_Keep; |
nothing calls this directly
no test coverage detected