MCPcopy Create free account
hub / github.com/NazaraEngine/NazaraEngine / Process

Method Process

src/Nazara/Graphics/DeferredPhongLightingPass.cpp:100–326  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

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;

Callers

nothing calls this directly

Calls 10

SendColorMethod · 0.80
SendVectorMethod · 0.80
GetEyePositionMethod · 0.80
SendIntegerMethod · 0.80
SendBooleanMethod · 0.80
GetIndexCountMethod · 0.80
GetUniformLocationMethod · 0.80
GetIndexBufferMethod · 0.45
GetVertexBufferMethod · 0.45
SetScaleMethod · 0.45

Tested by

no test coverage detected