Files
WickedEngine/WickedEngine/RenderPath3D_Forward.cpp
T
turanszkij 8c21ec9352 resurrected wiImage drawrect;
added sprite test;
refactors;
2018-11-19 19:04:42 +00:00

170 lines
5.7 KiB
C++

#include "RenderPath3D_Forward.h"
#include "wiRenderer.h"
#include "wiImage.h"
#include "wiHelper.h"
#include "wiProfiler.h"
#include "wiTextureHelper.h"
using namespace wiGraphicsTypes;
RenderPath3D_Forward::RenderPath3D_Forward()
{
RenderPath3D::setProperties();
setSSREnabled(false);
setSSAOEnabled(false);
setShadowsEnabled(false);
}
RenderPath3D_Forward::~RenderPath3D_Forward()
{
}
wiRenderTarget RenderPath3D_Forward::rtMain;
void RenderPath3D_Forward::ResizeBuffers()
{
RenderPath3D::ResizeBuffers();
FORMAT defaultTextureFormat = wiRenderer::GetDevice()->GetBackBufferFormat();
// Protect against multiple buffer resizes when there is no change!
static UINT lastBufferResWidth = 0, lastBufferResHeight = 0, lastBufferMSAA = 0;
static FORMAT lastBufferFormat = FORMAT_UNKNOWN;
if (lastBufferResWidth == wiRenderer::GetInternalResolution().x &&
lastBufferResHeight == wiRenderer::GetInternalResolution().y &&
lastBufferMSAA == getMSAASampleCount() &&
lastBufferFormat == defaultTextureFormat)
{
return;
}
else
{
lastBufferResWidth = wiRenderer::GetInternalResolution().x;
lastBufferResHeight = wiRenderer::GetInternalResolution().y;
lastBufferMSAA = getMSAASampleCount();
lastBufferFormat = defaultTextureFormat;
}
rtMain.Initialize(wiRenderer::GetInternalResolution().x, wiRenderer::GetInternalResolution().y, true, wiRenderer::RTFormat_hdr, 1, getMSAASampleCount(), false);
rtMain.Add(wiRenderer::RTFormat_gbuffer_1); // thin gbuffer
}
void RenderPath3D_Forward::Initialize()
{
ResizeBuffers();
RenderPath3D::Initialize();
}
void RenderPath3D_Forward::Load()
{
RenderPath3D::Load();
}
void RenderPath3D_Forward::Start()
{
RenderPath3D::Start();
}
void RenderPath3D_Forward::Render()
{
RenderFrameSetUp(GRAPHICSTHREAD_IMMEDIATE);
RenderShadows(GRAPHICSTHREAD_IMMEDIATE);
RenderReflections(GRAPHICSTHREAD_IMMEDIATE);
RenderScene(GRAPHICSTHREAD_IMMEDIATE);
RenderSecondaryScene(rtMain, rtMain, GRAPHICSTHREAD_IMMEDIATE);
RenderComposition(rtMain, rtMain, GRAPHICSTHREAD_IMMEDIATE);
RenderPath2D::Render();
}
void RenderPath3D_Forward::RenderScene(GRAPHICSTHREAD threadID)
{
wiProfiler::BeginRange("Opaque Scene", wiProfiler::DOMAIN_GPU, threadID);
wiRenderer::UpdateCameraCB(wiRenderer::GetCamera(), threadID);
GPUResource* dsv[] = { rtMain.depth->GetTexture() };
wiRenderer::GetDevice()->TransitionBarrier(dsv, ARRAYSIZE(dsv), RESOURCE_STATE_DEPTH_READ, RESOURCE_STATE_DEPTH_WRITE, threadID);
wiImageParams fx((float)wiRenderer::GetInternalResolution().x, (float)wiRenderer::GetInternalResolution().y);
rtMain.Activate(threadID, 0, 0, 0, 0);
{
wiRenderer::GetDevice()->BindResource(PS, getReflectionsEnabled() ? rtReflection.GetTexture() : wiTextureHelper::getTransparent(), TEXSLOT_RENDERABLECOMPONENT_REFLECTION, threadID);
wiRenderer::GetDevice()->BindResource(PS, getSSAOEnabled() ? rtSSAO.back().GetTexture() : wiTextureHelper::getWhite(), TEXSLOT_RENDERABLECOMPONENT_SSAO, threadID);
wiRenderer::GetDevice()->BindResource(PS, getSSREnabled() ? rtSSR.GetTexture() : wiTextureHelper::getTransparent(), TEXSLOT_RENDERABLECOMPONENT_SSR, threadID);
wiRenderer::DrawScene(wiRenderer::GetCamera(), getTessellationEnabled(), threadID, SHADERTYPE_FORWARD, getHairParticlesEnabled(), true, getLayerMask());
wiRenderer::DrawSky(threadID);
}
rtMain.Deactivate(threadID);
wiRenderer::BindGBufferTextures(rtMain.GetTextureResolvedMSAA(threadID, 0), rtMain.GetTextureResolvedMSAA(threadID, 1), nullptr, nullptr, nullptr, threadID);
wiRenderer::GetDevice()->TransitionBarrier(dsv, ARRAYSIZE(dsv), RESOURCE_STATE_DEPTH_WRITE, RESOURCE_STATE_COPY_SOURCE, threadID);
dtDepthCopy.CopyFrom(*rtMain.depth, threadID);
wiRenderer::GetDevice()->TransitionBarrier(dsv, ARRAYSIZE(dsv), RESOURCE_STATE_COPY_SOURCE, RESOURCE_STATE_DEPTH_READ, threadID);
rtLinearDepth.Activate(threadID); {
fx.blendFlag = BLENDMODE_OPAQUE;
fx.sampleFlag = SAMPLEMODE_CLAMP;
fx.quality = QUALITY_NEAREST;
fx.process.setLinDepth();
wiImage::Draw(dtDepthCopy.GetTextureResolvedMSAA(threadID), fx, threadID);
fx.process.clear();
}
rtLinearDepth.Deactivate(threadID);
wiRenderer::BindDepthTextures(dtDepthCopy.GetTextureResolvedMSAA(threadID), rtLinearDepth.GetTexture(), threadID);
if (getSSAOEnabled()) {
wiRenderer::GetDevice()->UnbindResources(TEXSLOT_RENDERABLECOMPONENT_SSAO, 1, threadID);
wiRenderer::GetDevice()->EventBegin("SSAO", threadID);
fx.stencilRef = STENCILREF_DEFAULT;
fx.stencilComp = STENCILMODE_LESS;
rtSSAO[0].Activate(threadID); {
fx.process.setSSAO();
fx.setMaskMap(wiTextureHelper::getRandom64x64());
fx.quality = QUALITY_BILINEAR;
fx.sampleFlag = SAMPLEMODE_MIRROR;
wiImage::Draw(nullptr, fx, threadID);
fx.process.clear();
}
rtSSAO[1].Activate(threadID); {
fx.process.setBlur(XMFLOAT2(getSSAOBlur(), 0));
fx.blendFlag = BLENDMODE_OPAQUE;
wiImage::Draw(rtSSAO[0].GetTexture(), fx, threadID);
}
rtSSAO[2].Activate(threadID); {
fx.process.setBlur(XMFLOAT2(0, getSSAOBlur()));
fx.blendFlag = BLENDMODE_OPAQUE;
wiImage::Draw(rtSSAO[1].GetTexture(), fx, threadID);
fx.process.clear();
}
fx.stencilRef = 0;
fx.stencilComp = STENCILMODE_DISABLED;
wiRenderer::GetDevice()->EventEnd(threadID);
}
if (getSSREnabled()) {
wiRenderer::GetDevice()->UnbindResources(TEXSLOT_RENDERABLECOMPONENT_SSR, 1, threadID);
wiRenderer::GetDevice()->EventBegin("SSR", threadID);
rtSSR.Activate(threadID); {
fx.process.clear();
fx.disableFullScreen();
fx.process.setSSR();
fx.setMaskMap(nullptr);
wiImage::Draw(rtMain.GetTexture(), fx, threadID);
fx.process.clear();
}
wiRenderer::GetDevice()->EventEnd(threadID);
}
wiProfiler::EndRange(threadID); // Opaque Scene
}
wiDepthTarget* RenderPath3D_Forward::GetDepthBuffer()
{
return rtMain.depth;
}