Forward RenderTechnique now handles non-lighting shaders

Former-commit-id: f243ba8aea76ada91510f6b36c292ae0e18e2add
This commit is contained in:
Lynix 2014-03-04 19:35:40 +01:00
parent 05e7e11356
commit 0f2cab56ff
1 changed files with 67 additions and 53 deletions

View File

@ -265,26 +265,29 @@ void NzForwardRenderTechnique::DrawOpaqueModels(const NzScene* scene) const
unsigned int passCount = (lightCount == 0) ? 1 : (lightCount-1)/NAZARA_GRAPHICS_MAX_LIGHTPERPASS + 1; unsigned int passCount = (lightCount == 0) ? 1 : (lightCount-1)/NAZARA_GRAPHICS_MAX_LIGHTPERPASS + 1;
for (unsigned int pass = 0; pass < passCount; ++pass) for (unsigned int pass = 0; pass < passCount; ++pass)
{ {
unsigned int renderedLightCount = std::min(lightCount, NAZARA_GRAPHICS_MAX_LIGHTPERPASS); if (lightUniforms->exists)
lightCount -= renderedLightCount;
if (pass == 1)
{ {
// Pour additionner le résultat des calculs de lumière unsigned int renderedLightCount = std::min(lightCount, NAZARA_GRAPHICS_MAX_LIGHTPERPASS);
// Aucune chance d'interférer avec les paramètres du matériau car nous ne rendons que les objets opaques lightCount -= renderedLightCount;
// (Autrement dit, sans blending)
// Quant à la fonction de profondeur, elle ne doit être appliquée que la première fois if (pass == 1)
NzRenderer::Enable(nzRendererParameter_Blend, true); {
NzRenderer::SetBlendFunc(nzBlendFunc_One, nzBlendFunc_One); // Pour additionner le résultat des calculs de lumière
NzRenderer::SetDepthFunc(nzRendererComparison_Equal); // Aucune chance d'interférer avec les paramètres du matériau car nous ne rendons que les objets opaques
// (Autrement dit, sans blending)
// Quant à la fonction de profondeur, elle ne doit être appliquée que la première fois
NzRenderer::Enable(nzRendererParameter_Blend, true);
NzRenderer::SetBlendFunc(nzBlendFunc_One, nzBlendFunc_One);
NzRenderer::SetDepthFunc(nzRendererComparison_Equal);
}
for (unsigned int i = 0; i < renderedLightCount; ++i)
m_directionalLights.GetLight(lightIndex++)->Enable(shader, lightUniforms->uniforms, lightUniforms->offset*i);
for (unsigned int i = renderedLightCount; i < NAZARA_GRAPHICS_MAX_LIGHTPERPASS; ++i)
NzLight::Disable(shader, lightUniforms->uniforms, lightUniforms->offset*i);
} }
for (unsigned int i = 0; i < renderedLightCount; ++i)
m_directionalLights.GetLight(lightIndex++)->Enable(shader, lightUniforms->uniforms, lightUniforms->offset*i);
for (unsigned int i = renderedLightCount; i < NAZARA_GRAPHICS_MAX_LIGHTPERPASS; ++i)
NzLight::Disable(shader, lightUniforms->uniforms, lightUniforms->offset*i);
const NzForwardRenderQueue::StaticData* data = &staticData[0]; const NzForwardRenderQueue::StaticData* data = &staticData[0];
unsigned int instanceCount = staticData.size(); unsigned int instanceCount = staticData.size();
unsigned int maxInstanceCount = instanceBuffer->GetVertexCount(); unsigned int maxInstanceCount = instanceBuffer->GetVertexCount();
@ -316,50 +319,61 @@ void NzForwardRenderTechnique::DrawOpaqueModels(const NzScene* scene) const
} }
else else
{ {
for (const NzForwardRenderQueue::StaticData& data : staticData) if (lightUniforms->exists)
{ {
unsigned int directionalLightCount = m_directionalLights.GetLightCount(); for (const NzForwardRenderQueue::StaticData& data : staticData)
unsigned int otherLightCount = m_lights.ComputeClosestLights(data.transformMatrix.GetTranslation() + boundingSphere.GetPosition(), boundingSphere.radius, m_maxLightPassPerObject*NAZARA_GRAPHICS_MAX_LIGHTPERPASS - directionalLightCount);
unsigned int lightCount = directionalLightCount + otherLightCount;
NzRenderer::SetMatrix(nzMatrixType_World, data.transformMatrix);
unsigned int directionalLightIndex = 0;
unsigned int otherLightIndex = 0;
nzRendererComparison oldDepthFunc = NzRenderer::GetDepthFunc();
unsigned int passCount = (lightCount == 0) ? 1 : (lightCount-1)/NAZARA_GRAPHICS_MAX_LIGHTPERPASS + 1;
for (unsigned int pass = 0; pass < passCount; ++pass)
{ {
unsigned int renderedLightCount = std::min(lightCount, NAZARA_GRAPHICS_MAX_LIGHTPERPASS); unsigned int directionalLightCount = m_directionalLights.GetLightCount();
lightCount -= renderedLightCount; unsigned int otherLightCount = m_lights.ComputeClosestLights(data.transformMatrix.GetTranslation() + boundingSphere.GetPosition(), boundingSphere.radius, m_maxLightPassPerObject*NAZARA_GRAPHICS_MAX_LIGHTPERPASS - directionalLightCount);
unsigned int lightCount = directionalLightCount + otherLightCount;
if (pass == 1) NzRenderer::SetMatrix(nzMatrixType_World, data.transformMatrix);
unsigned int directionalLightIndex = 0;
unsigned int otherLightIndex = 0;
nzRendererComparison oldDepthFunc = NzRenderer::GetDepthFunc();
unsigned int passCount = (lightCount == 0) ? 1 : (lightCount-1)/NAZARA_GRAPHICS_MAX_LIGHTPERPASS + 1;
for (unsigned int pass = 0; pass < passCount; ++pass)
{ {
// Pour additionner le résultat des calculs de lumière unsigned int renderedLightCount = std::min(lightCount, NAZARA_GRAPHICS_MAX_LIGHTPERPASS);
// Aucune chance d'interférer avec les paramètres du matériau car nous ne rendons que les objets opaques lightCount -= renderedLightCount;
// (Autrement dit, sans blending)
// Quant à la fonction de profondeur, elle ne doit être appliquée que la première fois if (pass == 1)
NzRenderer::Enable(nzRendererParameter_Blend, true); {
NzRenderer::SetBlendFunc(nzBlendFunc_One, nzBlendFunc_One); // Pour additionner le résultat des calculs de lumière
NzRenderer::SetDepthFunc(nzRendererComparison_Equal); // Aucune chance d'interférer avec les paramètres du matériau car nous ne rendons que les objets opaques
// (Autrement dit, sans blending)
// Quant à la fonction de profondeur, elle ne doit être appliquée que la première fois
NzRenderer::Enable(nzRendererParameter_Blend, true);
NzRenderer::SetBlendFunc(nzBlendFunc_One, nzBlendFunc_One);
NzRenderer::SetDepthFunc(nzRendererComparison_Equal);
}
for (unsigned int i = 0; i < renderedLightCount; ++i)
{
if (directionalLightIndex >= directionalLightCount)
m_lights.GetResult(otherLightIndex++)->Enable(shader, lightUniforms->uniforms, lightUniforms->offset*i);
else
m_directionalLights.GetLight(directionalLightIndex++)->Enable(shader, lightUniforms->uniforms, lightUniforms->offset*i);
}
for (unsigned int i = renderedLightCount; i < NAZARA_GRAPHICS_MAX_LIGHTPERPASS; ++i)
NzLight::Disable(shader, lightUniforms->uniforms, lightUniforms->offset*i);
DrawFunc(primitiveMode, 0, indexCount);
} }
for (unsigned int i = 0; i < renderedLightCount; ++i) NzRenderer::Enable(nzRendererParameter_Blend, false);
{ NzRenderer::SetDepthFunc(oldDepthFunc);
if (directionalLightIndex >= directionalLightCount) }
m_lights.GetResult(otherLightIndex++)->Enable(shader, lightUniforms->uniforms, lightUniforms->offset*i); }
else else
m_directionalLights.GetLight(directionalLightIndex++)->Enable(shader, lightUniforms->uniforms, lightUniforms->offset*i); {
} for (const NzForwardRenderQueue::StaticData& data : staticData)
{
for (unsigned int i = renderedLightCount; i < NAZARA_GRAPHICS_MAX_LIGHTPERPASS; ++i) NzRenderer::SetMatrix(nzMatrixType_World, data.transformMatrix);
NzLight::Disable(shader, lightUniforms->uniforms, lightUniforms->offset*i);
DrawFunc(primitiveMode, 0, indexCount); DrawFunc(primitiveMode, 0, indexCount);
} }
NzRenderer::Enable(nzRendererParameter_Blend, false);
NzRenderer::SetDepthFunc(oldDepthFunc);
} }
} }
staticData.clear(); staticData.clear();