From 319fd3b7e195270a01488ea44c07ac53e6c54ede Mon Sep 17 00:00:00 2001 From: turanszkij Date: Thu, 16 Feb 2017 01:01:56 +0100 Subject: [PATCH] optimized reflection rendering --- WickedEngine/Renderable3DComponent.cpp | 35 ++++++++++++++------------ WickedEngine/wiRenderer.cpp | 9 +++---- WickedEngine/wiRenderer.h | 2 ++ WickedEngine/wiVersion.cpp | 2 +- 4 files changed, 26 insertions(+), 22 deletions(-) diff --git a/WickedEngine/Renderable3DComponent.cpp b/WickedEngine/Renderable3DComponent.cpp index 9a7c9461c..c85d4dbf2 100644 --- a/WickedEngine/Renderable3DComponent.cpp +++ b/WickedEngine/Renderable3DComponent.cpp @@ -221,24 +221,27 @@ void Renderable3DComponent::RenderReflections(GRAPHICSTHREAD threadID) } wiProfiler::GetInstance().BeginRange("Reflection rendering", wiProfiler::DOMAIN_GPU, threadID); - wiRenderer::UpdateCameraCB(wiRenderer::getRefCamera(), threadID); + if (wiRenderer::IsRequestedReflectionRendering()) + { + wiRenderer::UpdateCameraCB(wiRenderer::getRefCamera(), threadID); - rtReflection.Activate(threadID); { - // reverse clipping if underwater - XMFLOAT4 water = wiRenderer::GetWaterPlane().getXMFLOAT4(); - if (XMVectorGetX(XMPlaneDot(XMLoadFloat4(&water), wiRenderer::getCamera()->GetEye())) < 0 ) - { - water.x *= -1; - water.y *= -1; - water.z *= -1; + rtReflection.Activate(threadID); { + // reverse clipping if underwater + XMFLOAT4 water = wiRenderer::GetWaterPlane().getXMFLOAT4(); + if (XMVectorGetX(XMPlaneDot(XMLoadFloat4(&water), wiRenderer::getCamera()->GetEye())) < 0) + { + water.x *= -1; + water.y *= -1; + water.z *= -1; + } + + wiRenderer::SetClipPlane(water, threadID); + + wiRenderer::DrawWorld(wiRenderer::getRefCamera(), false, threadID, SHADERTYPE_TEXTURE, nullptr, getHairParticlesReflectionEnabled()); + wiRenderer::DrawSky(threadID); + + wiRenderer::SetClipPlane(XMFLOAT4(0, 0, 0, 0), threadID); } - - wiRenderer::SetClipPlane(water, threadID); - - wiRenderer::DrawWorld(wiRenderer::getRefCamera(), false, threadID, SHADERTYPE_TEXTURE, nullptr, getHairParticlesReflectionEnabled()); - wiRenderer::DrawSky(threadID); - - wiRenderer::SetClipPlane(XMFLOAT4(0, 0, 0, 0), threadID); } wiProfiler::GetInstance().EndRange(); // Reflection Rendering diff --git a/WickedEngine/wiRenderer.cpp b/WickedEngine/wiRenderer.cpp index 484ff8377..4f0f893ce 100644 --- a/WickedEngine/wiRenderer.cpp +++ b/WickedEngine/wiRenderer.cpp @@ -49,7 +49,7 @@ Texture *wiRenderer::textures[TEXTYPE_LAST]; int wiRenderer::SHADOWRES_2D = 1024, wiRenderer::SHADOWRES_CUBE = 256, wiRenderer::SHADOWCOUNT_2D = 5 + 3 + 3, wiRenderer::SHADOWCOUNT_CUBE = 5, wiRenderer::SOFTSHADOWQUALITY_2D = 2; bool wiRenderer::HAIRPARTICLEENABLED=true,wiRenderer::EMITTERSENABLED=true; bool wiRenderer::wireRender = false, wiRenderer::debugSpheres = false, wiRenderer::debugBoneLines = false, wiRenderer::debugPartitionTree = false -, wiRenderer::debugEnvProbes = false, wiRenderer::gridHelper = false; +, wiRenderer::debugEnvProbes = false, wiRenderer::gridHelper = false, wiRenderer::requestReflectionRendering = false; Texture2D* wiRenderer::enviroMap,*wiRenderer::colorGrading; float wiRenderer::GameSpeed=1,wiRenderer::overrideGameSpeed=1; @@ -1405,6 +1405,7 @@ void wiRenderer::UpdatePerFrameData() wiProfiler::GetInstance().EndRange(); // SPTree Update // Perform culling and obtain closest reflector: + requestReflectionRendering = false; wiProfiler::GetInstance().BeginRange("SPTree Culling", wiProfiler::DOMAIN_CPU); { for (auto& x : frameCullings) @@ -1423,8 +1424,6 @@ void wiRenderer::UpdatePerFrameData() if (spTree != nullptr) { - bool foundClosestReflector = false; - CulledList culledObjects; spTree->getVisible(camera->frustum, culledObjects, wiSPTree::SortType::SP_TREE_SORT_FRONT_TO_BACK); for (Cullable* x : culledObjects) @@ -1439,14 +1438,14 @@ void wiRenderer::UpdatePerFrameData() { culling.culledRenderer_opaque[object->mesh].push_front(object); } - if (!foundClosestReflector && camera == getCamera() && object->IsReflector()) + if (!requestReflectionRendering && camera == getCamera() && object->IsReflector()) { // If it is the main camera's culling, then obtain the reflectors: XMVECTOR _refPlane = XMPlaneFromPointNormal(XMLoadFloat3(&object->/*bounds.getCenter()*/translation), XMVectorSet(0, 1, 0, 0)); XMFLOAT4 plane; XMStoreFloat4(&plane, _refPlane); waterPlane = wiWaterPlane(plane.x, plane.y, plane.z, plane.w); - foundClosestReflector = true; + requestReflectionRendering = true; } } wiSPTree::Sort(camera->translation, culledObjects, wiSPTree::SortType::SP_TREE_SORT_BACK_TO_FRONT); diff --git a/WickedEngine/wiRenderer.h b/WickedEngine/wiRenderer.h index ff55af5cf..eadbf5086 100644 --- a/WickedEngine/wiRenderer.h +++ b/WickedEngine/wiRenderer.h @@ -271,6 +271,7 @@ protected: static bool wireRender, debugSpheres, debugBoneLines, debugPartitionTree, debugEnvProbes, gridHelper; + static bool requestReflectionRendering; static wiGraphicsTypes::Texture2D* enviroMap,*colorGrading; @@ -332,6 +333,7 @@ public: static bool GetDebugLightCulling() { return debugLightCulling; } static void SetOcclusionCullingEnabled(bool enabled) { occlusionCulling = enabled; } static bool GetOcclusionCullingEnabled() { return occlusionCulling; } + static bool IsRequestedReflectionRendering() { return requestReflectionRendering; } static wiGraphicsTypes::Texture2D* GetColorGrading(){return colorGrading;}; static void SetColorGrading(wiGraphicsTypes::Texture2D* tex){colorGrading=tex;}; static void SetEnviromentMap(wiGraphicsTypes::Texture2D* tex){ enviroMap = tex; } diff --git a/WickedEngine/wiVersion.cpp b/WickedEngine/wiVersion.cpp index fb604f545..dd6f813f4 100644 --- a/WickedEngine/wiVersion.cpp +++ b/WickedEngine/wiVersion.cpp @@ -7,7 +7,7 @@ namespace wiVersion // minor features, major updates const int minor = 9; // minor bug fixes, alterations, refactors, updates - const int revision = 65; + const int revision = 66; long GetVersion()