optimized reflection rendering
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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; }
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user