optimized reflection rendering

This commit is contained in:
turanszkij
2017-02-16 01:01:56 +01:00
parent 638cfa5e93
commit 319fd3b7e1
4 changed files with 26 additions and 22 deletions
+19 -16
View File
@@ -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
+4 -5
View File
@@ -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);
+2
View File
@@ -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; }
+1 -1
View File
@@ -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()