From dd2c7d89a99f52dc8b6bfa90cb895f7d89beacbb Mon Sep 17 00:00:00 2001 From: turanszkij Date: Tue, 6 Mar 2018 16:34:27 +0000 Subject: [PATCH] big visual update: ssr and ssao reprojection, enabled for all render paths; better reflection fallback system; updated lighting system; updated refractions; renderer updates; render path updates; --- WickedEngine/DeferredRenderableComponent.cpp | 10 +++- WickedEngine/ForwardRenderableComponent.cpp | 57 ++++++++++++++++++- WickedEngine/Renderable3DComponent.cpp | 9 +-- WickedEngine/ResourceMapping.h | 9 +++ .../TiledDeferredRenderableComponent.cpp | 15 +++-- .../TiledForwardRenderableComponent.cpp | 27 +++++---- WickedEngine/deferredLightHF.hlsli | 6 +- WickedEngine/environmentalLightPS.hlsl | 4 ++ WickedEngine/hairparticlePS_forward.hlsl | 2 +- WickedEngine/hairparticlePS_tiledforward.hlsl | 2 +- WickedEngine/lightCullingCS.hlsl | 9 ++- WickedEngine/objectDS.hlsl | 2 +- WickedEngine/objectHF.hlsli | 27 +++++---- WickedEngine/objectVS_common.hlsl | 2 +- WickedEngine/oceanSurfacePS.hlsl | 2 +- WickedEngine/shadowPS_transparent.hlsl | 3 +- WickedEngine/ssao.hlsl | 2 +- WickedEngine/ssr.hlsl | 2 +- WickedEngine/waterVS.hlsl | 2 +- WickedEngine/wiRenderer.cpp | 37 +----------- WickedEngine/wiRenderer.h | 6 +- WickedEngine/wiVersion.cpp | 2 +- 22 files changed, 145 insertions(+), 92 deletions(-) diff --git a/WickedEngine/DeferredRenderableComponent.cpp b/WickedEngine/DeferredRenderableComponent.cpp index b0ac288a8..cd5ff55a3 100644 --- a/WickedEngine/DeferredRenderableComponent.cpp +++ b/WickedEngine/DeferredRenderableComponent.cpp @@ -131,8 +131,8 @@ void DeferredRenderableComponent::RenderScene(GRAPHICSTHREAD threadID) rtGBuffer.Activate(threadID, 0, 0, 0, 0); { - wiRenderer::DrawWorld(wiRenderer::getCamera(), getTessellationEnabled(), threadID, SHADERTYPE_DEFERRED, - rtReflection.GetTexture(), nullptr, nullptr, getHairParticlesEnabled(), true); + wiRenderer::GetDevice()->BindResource(PS, getReflectionsEnabled() ? rtReflection.GetTexture() : wiTextureHelper::getInstance()->getTransparent(), TEXSLOT_RENDERABLECOMPONENT_REFLECTION, threadID); + wiRenderer::DrawWorld(wiRenderer::getCamera(), getTessellationEnabled(), threadID, SHADERTYPE_DEFERRED, getHairParticlesEnabled(), true); } wiRenderer::GetDevice()->TransitionBarrier(dsv, ARRAYSIZE(dsv), RESOURCE_STATE_DEPTH_WRITE, RESOURCE_STATE_COPY_SOURCE, threadID); @@ -168,12 +168,16 @@ void DeferredRenderableComponent::RenderScene(GRAPHICSTHREAD threadID) wiRenderer::UpdateGBuffer(rtGBuffer.GetTexture(0), rtGBuffer.GetTexture(1), rtGBuffer.GetTexture(2), rtGBuffer.GetTexture(3), nullptr, threadID); + + rtLight.Activate(threadID, rtGBuffer.depth); { + wiRenderer::GetDevice()->BindResource(PS, getSSREnabled() ? rtSSR.GetTexture() : wiTextureHelper::getInstance()->getTransparent(), TEXSLOT_RENDERABLECOMPONENT_SSR, threadID); wiRenderer::DrawLights(wiRenderer::getCamera(), threadID); } if (getSSAOEnabled()) { + wiRenderer::GetDevice()->UnBindResources(TEXSLOT_RENDERABLECOMPONENT_SSAO, 1, threadID); wiRenderer::GetDevice()->EventBegin("SSAO", threadID); fx.stencilRef = STENCILREF_DEFAULT; fx.stencilComp = STENCILMODE_LESS; @@ -267,6 +271,7 @@ void DeferredRenderableComponent::RenderScene(GRAPHICSTHREAD threadID) } if (getSSREnabled()) { + wiRenderer::GetDevice()->UnBindResources(TEXSLOT_RENDERABLECOMPONENT_SSR, 1, threadID); wiRenderer::GetDevice()->EventBegin("SSR", threadID); rtSSR.Activate(threadID); { fx.process.clear(); @@ -280,7 +285,6 @@ void DeferredRenderableComponent::RenderScene(GRAPHICSTHREAD threadID) wiRenderer::GetDevice()->EventEnd(threadID); } - wiProfiler::GetInstance().EndRange(threadID); // Opaque Scene } diff --git a/WickedEngine/ForwardRenderableComponent.cpp b/WickedEngine/ForwardRenderableComponent.cpp index 407b71424..f761df218 100644 --- a/WickedEngine/ForwardRenderableComponent.cpp +++ b/WickedEngine/ForwardRenderableComponent.cpp @@ -4,6 +4,7 @@ #include "wiImageEffects.h" #include "wiHelper.h" #include "wiProfiler.h" +#include "wiTextureHelper.h" using namespace wiGraphicsTypes; @@ -105,10 +106,14 @@ void ForwardRenderableComponent::RenderScene(GRAPHICSTHREAD threadID) GPUResource* dsv[] = { rtMain.depth->GetTexture() }; wiRenderer::GetDevice()->TransitionBarrier(dsv, ARRAYSIZE(dsv), RESOURCE_STATE_DEPTH_READ, RESOURCE_STATE_DEPTH_WRITE, threadID); + wiImageEffects fx((float)wiRenderer::GetInternalResolution().x, (float)wiRenderer::GetInternalResolution().y); + rtMain.Activate(threadID, 0, 0, 0, 0); { - wiRenderer::DrawWorld(wiRenderer::getCamera(), getTessellationEnabled(), threadID, SHADERTYPE_FORWARD, - rtReflection.GetTexture(), nullptr, nullptr, getHairParticlesEnabled(), true); + wiRenderer::GetDevice()->BindResource(PS, getReflectionsEnabled() ? rtReflection.GetTexture() : wiTextureHelper::getInstance()->getTransparent(), TEXSLOT_RENDERABLECOMPONENT_REFLECTION, threadID); + wiRenderer::GetDevice()->BindResource(PS, getSSAOEnabled() ? rtSSAO.back().GetTexture() : wiTextureHelper::getInstance()->getWhite(), TEXSLOT_RENDERABLECOMPONENT_SSAO, threadID); + wiRenderer::GetDevice()->BindResource(PS, getSSREnabled() ? rtSSR.GetTexture() : wiTextureHelper::getInstance()->getTransparent(), TEXSLOT_RENDERABLECOMPONENT_SSR, threadID); + wiRenderer::DrawWorld(wiRenderer::getCamera(), getTessellationEnabled(), threadID, SHADERTYPE_FORWARD, getHairParticlesEnabled(), true); wiRenderer::DrawSky(threadID); } rtMain.Deactivate(threadID); @@ -121,17 +126,63 @@ void ForwardRenderableComponent::RenderScene(GRAPHICSTHREAD threadID) wiRenderer::GetDevice()->TransitionBarrier(dsv, ARRAYSIZE(dsv), RESOURCE_STATE_COPY_SOURCE, RESOURCE_STATE_DEPTH_READ, threadID); rtLinearDepth.Activate(threadID); { - wiImageEffects fx; fx.blendFlag = BLENDMODE_OPAQUE; fx.sampleFlag = SAMPLEMODE_CLAMP; fx.quality = QUALITY_NEAREST; fx.process.setLinDepth(true); wiImage::Draw(dtDepthCopy.GetTextureResolvedMSAA(threadID), fx, threadID); + fx.process.clear(); } rtLinearDepth.Deactivate(threadID); wiRenderer::UpdateDepthBuffer(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(true); + fx.setMaskMap(wiTextureHelper::getInstance()->getRandom64x64()); + fx.quality = QUALITY_BILINEAR; + fx.sampleFlag = SAMPLEMODE_MIRROR; + wiImage::Draw(nullptr, fx, threadID); + fx.process.clear(); + } + rtSSAO[1].Activate(threadID); { + fx.blur = getSSAOBlur(); + fx.blurDir = 0; + fx.blendFlag = BLENDMODE_OPAQUE; + wiImage::Draw(rtSSAO[0].GetTexture(), fx, threadID); + } + rtSSAO[2].Activate(threadID); { + fx.blur = getSSAOBlur(); + fx.blurDir = 1; + fx.blendFlag = BLENDMODE_OPAQUE; + wiImage::Draw(rtSSAO[1].GetTexture(), fx, threadID); + fx.blur = 0; + } + 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.presentFullScreen = false; + fx.process.setSSR(true); + fx.setMaskMap(nullptr); + wiImage::Draw(rtMain.GetTexture(), fx, threadID); + fx.process.clear(); + } + wiRenderer::GetDevice()->EventEnd(threadID); + } + wiProfiler::GetInstance().EndRange(threadID); // Opaque Scene } diff --git a/WickedEngine/Renderable3DComponent.cpp b/WickedEngine/Renderable3DComponent.cpp index e19a53962..ad51a1b32 100644 --- a/WickedEngine/Renderable3DComponent.cpp +++ b/WickedEngine/Renderable3DComponent.cpp @@ -290,8 +290,7 @@ void Renderable3DComponent::RenderReflections(GRAPHICSTHREAD threadID) wiRenderer::SetClipPlane(water, threadID); - wiRenderer::DrawWorld(wiRenderer::getRefCamera(), false, threadID, SHADERTYPE_TEXTURE, - nullptr, nullptr, nullptr, getHairParticlesReflectionEnabled(), false); + wiRenderer::DrawWorld(wiRenderer::getRefCamera(), false, threadID, SHADERTYPE_TEXTURE, getHairParticlesReflectionEnabled(), false); wiRenderer::DrawSky(threadID); wiRenderer::SetClipPlane(XMFLOAT4(0, 0, 0, 0), threadID); @@ -483,8 +482,10 @@ void Renderable3DComponent::RenderTransparentScene(wiRenderTarget& refractionRT, { wiProfiler::GetInstance().BeginRange("Transparent Scene", wiProfiler::DOMAIN_GPU, threadID); - wiRenderer::DrawWorldTransparent(wiRenderer::getCamera(), SHADERTYPE_FORWARD, refractionRT.GetTexture(), rtReflection.GetTexture() - , rtWaterRipple.GetTexture(), threadID, false, true); + wiRenderer::GetDevice()->BindResource(PS, getReflectionsEnabled() ? rtReflection.GetTexture() : wiTextureHelper::getInstance()->getTransparent(), TEXSLOT_RENDERABLECOMPONENT_REFLECTION, threadID); + wiRenderer::GetDevice()->BindResource(PS, refractionRT.GetTexture(), TEXSLOT_RENDERABLECOMPONENT_REFRACTION, threadID); + wiRenderer::GetDevice()->BindResource(PS, rtWaterRipple.GetTexture(), TEXSLOT_RENDERABLECOMPONENT_WATERRIPPLES, threadID); + wiRenderer::DrawWorldTransparent(wiRenderer::getCamera(), SHADERTYPE_FORWARD, threadID, false, true); wiProfiler::GetInstance().EndRange(threadID); // Transparent Scene } diff --git a/WickedEngine/ResourceMapping.h b/WickedEngine/ResourceMapping.h index df4bc8910..264e0af7e 100644 --- a/WickedEngine/ResourceMapping.h +++ b/WickedEngine/ResourceMapping.h @@ -69,4 +69,13 @@ #define SKINNINGSLOT_OUT_VERTEX_PRE 1 + +// RenderableComponent texture mappings: +#define TEXSLOT_RENDERABLECOMPONENT_REFLECTION TEXSLOT_ONDEMAND6 +#define TEXSLOT_RENDERABLECOMPONENT_REFRACTION TEXSLOT_ONDEMAND7 +#define TEXSLOT_RENDERABLECOMPONENT_WATERRIPPLES TEXSLOT_ONDEMAND8 +#define TEXSLOT_RENDERABLECOMPONENT_SSAO TEXSLOT_ONDEMAND8 +#define TEXSLOT_RENDERABLECOMPONENT_SSR TEXSLOT_ONDEMAND9 + + #endif // _RESOURCEBUFFER_MAPPING_H_ diff --git a/WickedEngine/TiledDeferredRenderableComponent.cpp b/WickedEngine/TiledDeferredRenderableComponent.cpp index 07d04ebb2..f0e4c9b38 100644 --- a/WickedEngine/TiledDeferredRenderableComponent.cpp +++ b/WickedEngine/TiledDeferredRenderableComponent.cpp @@ -41,8 +41,8 @@ void TiledDeferredRenderableComponent::RenderScene(GRAPHICSTHREAD threadID) { wiRenderer::SetAlphaRef(0.25f, threadID); } - wiRenderer::DrawWorld(wiRenderer::getCamera(), getTessellationEnabled(), threadID, SHADERTYPE_DEFERRED, - rtReflection.GetTexture(), nullptr, nullptr, getHairParticlesEnabled(), true); + wiRenderer::GetDevice()->BindResource(PS, getReflectionsEnabled() ? rtReflection.GetTexture() : wiTextureHelper::getInstance()->getTransparent(), TEXSLOT_RENDERABLECOMPONENT_REFLECTION, threadID); + wiRenderer::DrawWorld(wiRenderer::getCamera(), getTessellationEnabled(), threadID, SHADERTYPE_DEFERRED, getHairParticlesEnabled(), true); } @@ -80,10 +80,14 @@ void TiledDeferredRenderableComponent::RenderScene(GRAPHICSTHREAD threadID) wiRenderer::UpdateGBuffer(rtGBuffer.GetTexture(0), rtGBuffer.GetTexture(1), rtGBuffer.GetTexture(2), rtGBuffer.GetTexture(3), nullptr, threadID); + + wiRenderer::GetDevice()->BindResource(CS, getSSREnabled() ? rtSSR.GetTexture() : wiTextureHelper::getInstance()->getTransparent(), TEXSLOT_RENDERABLECOMPONENT_SSR, threadID); + wiRenderer::ComputeTiledLightCulling(true, threadID); if (getSSAOEnabled()) { + wiRenderer::GetDevice()->UnBindResources(TEXSLOT_RENDERABLECOMPONENT_SSAO, 1, threadID); wiRenderer::GetDevice()->EventBegin("SSAO", threadID); fx.stencilRef = STENCILREF_DEFAULT; fx.stencilComp = STENCILMODE_LESS; @@ -178,6 +182,7 @@ void TiledDeferredRenderableComponent::RenderScene(GRAPHICSTHREAD threadID) } if (getSSREnabled()) { + wiRenderer::GetDevice()->UnBindResources(TEXSLOT_RENDERABLECOMPONENT_SSR, 1, threadID); wiRenderer::GetDevice()->EventBegin("SSR", threadID); rtSSR.Activate(threadID); { fx.process.clear(); @@ -197,8 +202,10 @@ void TiledDeferredRenderableComponent::RenderTransparentScene(wiRenderTarget& re { wiProfiler::GetInstance().BeginRange("Transparent Scene", wiProfiler::DOMAIN_GPU, threadID); - wiRenderer::DrawWorldTransparent(wiRenderer::getCamera(), SHADERTYPE_TILEDFORWARD, refractionRT.GetTexture(), rtReflection.GetTexture() - , rtWaterRipple.GetTexture(), threadID, getHairParticlesEnabled() && getHairParticleAlphaCompositionEnabled(), true); + wiRenderer::GetDevice()->BindResource(PS, getReflectionsEnabled() ? rtReflection.GetTexture() : wiTextureHelper::getInstance()->getTransparent(), TEXSLOT_RENDERABLECOMPONENT_REFLECTION, threadID); + wiRenderer::GetDevice()->BindResource(PS, refractionRT.GetTexture(), TEXSLOT_RENDERABLECOMPONENT_REFRACTION, threadID); + wiRenderer::GetDevice()->BindResource(PS, rtWaterRipple.GetTexture(), TEXSLOT_RENDERABLECOMPONENT_WATERRIPPLES, threadID); + wiRenderer::DrawWorldTransparent(wiRenderer::getCamera(), SHADERTYPE_TILEDFORWARD, threadID, getHairParticlesEnabled() && getHairParticleAlphaCompositionEnabled(), true); wiProfiler::GetInstance().EndRange(); // Transparent Scene } diff --git a/WickedEngine/TiledForwardRenderableComponent.cpp b/WickedEngine/TiledForwardRenderableComponent.cpp index 188ae544b..3857e5b92 100644 --- a/WickedEngine/TiledForwardRenderableComponent.cpp +++ b/WickedEngine/TiledForwardRenderableComponent.cpp @@ -35,8 +35,7 @@ void TiledForwardRenderableComponent::RenderScene(GRAPHICSTHREAD threadID) { wiRenderer::SetAlphaRef(0.25f, threadID); } - wiRenderer::DrawWorld(wiRenderer::getCamera(), getTessellationEnabled(), threadID, SHADERTYPE_DEPTHONLY, - nullptr, nullptr, nullptr, getHairParticlesEnabled(), true); + wiRenderer::DrawWorld(wiRenderer::getCamera(), getTessellationEnabled(), threadID, SHADERTYPE_DEPTHONLY, getHairParticlesEnabled(), true); } wiProfiler::GetInstance().EndRange(threadID); @@ -65,24 +64,19 @@ void TiledForwardRenderableComponent::RenderScene(GRAPHICSTHREAD threadID) wiProfiler::GetInstance().BeginRange("Opaque Scene", wiProfiler::DOMAIN_GPU, threadID); rtMain.Set(threadID); { - if (getSSAOEnabled()) { - wiRenderer::GetDevice()->BindResource(PS, rtSSAO.back().GetTexture(), TEXSLOT_ONDEMAND8, threadID); - } - if (getSSREnabled()) { - wiRenderer::GetDevice()->BindResource(PS, rtSSR.GetTexture(), TEXSLOT_ONDEMAND9, threadID); - } - wiRenderer::DrawWorld(wiRenderer::getCamera(), getTessellationEnabled(), threadID, SHADERTYPE_TILEDFORWARD, - rtReflection.GetTexture(), getSSAOEnabled() ? rtSSAO.back().GetTexture() : nullptr, getSSREnabled() ? rtSSR.GetTexture() : nullptr, true, true); + wiRenderer::GetDevice()->BindResource(PS, getReflectionsEnabled() ? rtReflection.GetTexture() : wiTextureHelper::getInstance()->getTransparent(), TEXSLOT_RENDERABLECOMPONENT_REFLECTION, threadID); + wiRenderer::GetDevice()->BindResource(PS, getSSAOEnabled() ? rtSSAO.back().GetTexture() : wiTextureHelper::getInstance()->getWhite(), TEXSLOT_RENDERABLECOMPONENT_SSAO, threadID); + wiRenderer::GetDevice()->BindResource(PS, getSSREnabled() ? rtSSR.GetTexture() : wiTextureHelper::getInstance()->getTransparent(), TEXSLOT_RENDERABLECOMPONENT_SSR, threadID); + wiRenderer::DrawWorld(wiRenderer::getCamera(), getTessellationEnabled(), threadID, SHADERTYPE_TILEDFORWARD, true, true); wiRenderer::DrawSky(threadID); } rtMain.Deactivate(threadID); wiRenderer::UpdateGBuffer(rtMain.GetTextureResolvedMSAA(threadID, 0), rtMain.GetTextureResolvedMSAA(threadID, 1), nullptr, nullptr, nullptr, threadID); - wiProfiler::GetInstance().EndRange(threadID); // Opaque Scene - if (getSSAOEnabled()) { + wiRenderer::GetDevice()->UnBindResources(TEXSLOT_RENDERABLECOMPONENT_SSAO, 1, threadID); wiRenderer::GetDevice()->EventBegin("SSAO", threadID); fx.stencilRef = STENCILREF_DEFAULT; fx.stencilComp = STENCILMODE_LESS; @@ -113,6 +107,7 @@ void TiledForwardRenderableComponent::RenderScene(GRAPHICSTHREAD threadID) } if (getSSREnabled()) { + wiRenderer::GetDevice()->UnBindResources(TEXSLOT_RENDERABLECOMPONENT_SSR, 1, threadID); wiRenderer::GetDevice()->EventBegin("SSR", threadID); rtSSR.Activate(threadID); { fx.process.clear(); @@ -124,13 +119,17 @@ void TiledForwardRenderableComponent::RenderScene(GRAPHICSTHREAD threadID) } wiRenderer::GetDevice()->EventEnd(threadID); } + + wiProfiler::GetInstance().EndRange(threadID); // Opaque Scene } void TiledForwardRenderableComponent::RenderTransparentScene(wiRenderTarget& refractionRT, GRAPHICSTHREAD threadID) { wiProfiler::GetInstance().BeginRange("Transparent Scene", wiProfiler::DOMAIN_GPU, threadID); - wiRenderer::DrawWorldTransparent(wiRenderer::getCamera(), SHADERTYPE_TILEDFORWARD, refractionRT.GetTexture(), rtReflection.GetTexture() - , rtWaterRipple.GetTexture(), threadID, getHairParticlesEnabled() && getHairParticleAlphaCompositionEnabled(), true); + wiRenderer::GetDevice()->BindResource(PS, getReflectionsEnabled() ? rtReflection.GetTexture() : wiTextureHelper::getInstance()->getTransparent(), TEXSLOT_RENDERABLECOMPONENT_REFLECTION, threadID); + wiRenderer::GetDevice()->BindResource(PS, refractionRT.GetTexture(), TEXSLOT_RENDERABLECOMPONENT_REFRACTION, threadID); + wiRenderer::GetDevice()->BindResource(PS, rtWaterRipple.GetTexture(), TEXSLOT_RENDERABLECOMPONENT_WATERRIPPLES, threadID); + wiRenderer::DrawWorldTransparent(wiRenderer::getCamera(), SHADERTYPE_TILEDFORWARD, threadID, getHairParticlesEnabled() && getHairParticleAlphaCompositionEnabled(), true); wiProfiler::GetInstance().EndRange(threadID); // Transparent Scene } diff --git a/WickedEngine/deferredLightHF.hlsli b/WickedEngine/deferredLightHF.hlsli index 16aac5387..cb2ff0937 100644 --- a/WickedEngine/deferredLightHF.hlsli +++ b/WickedEngine/deferredLightHF.hlsli @@ -26,17 +26,19 @@ struct LightOutputType #define DEFERREDLIGHT_MAKEPARAMS \ ShaderEntityType light = EntityArray[PSIn.lightIndex]; \ float3 diffuse, specular; \ - float2 screenPos = float2(1, -1) * PSIn.pos2D.xy / PSIn.pos2D.w / 2.0f + 0.5f; \ + float2 ScreenCoord = float2(1, -1) * PSIn.pos2D.xy / PSIn.pos2D.w * 0.5f + 0.5f; \ float depth = texture_depth[PSIn.pos.xy]; \ float4 baseColor = texture_gbuffer0[PSIn.pos.xy]; \ float4 g1 = texture_gbuffer1[PSIn.pos.xy]; \ float4 g3 = texture_gbuffer3[PSIn.pos.xy]; \ float3 N = decode(g1.xy); \ + float2 velocity = g1.zw; \ float roughness = g3.x; \ float reflectance = g3.y; \ float metalness = g3.z; \ float ao = g3.w; \ - float3 P = getPosition(screenPos, depth); \ + float2 ReprojectedScreenCoord = ScreenCoord + velocity; \ + float3 P = getPosition(ScreenCoord, depth); \ float3 V = normalize(g_xCamera_CamPos - P); \ Surface surface = CreateSurface(P, N, V, baseColor, reflectance, metalness, roughness); diff --git a/WickedEngine/environmentalLightPS.hlsl b/WickedEngine/environmentalLightPS.hlsl index f08873e8d..d0ce549f6 100644 --- a/WickedEngine/environmentalLightPS.hlsl +++ b/WickedEngine/environmentalLightPS.hlsl @@ -1,5 +1,6 @@ #include "deferredLightHF.hlsli" +#define xSSR texture_9 LightOutputType main(VertexToPixel PSIn) @@ -11,6 +12,9 @@ LightOutputType main(VertexToPixel PSIn) specular = max(0, EnvironmentReflection_Global(surface, envMapMIP)); VoxelGI(surface, diffuse, specular, ao); + float4 ssr = xSSR.SampleLevel(sampler_linear_clamp, ReprojectedScreenCoord, 0); + specular = lerp(specular, ssr.rgb, ssr.a); + specular *= surface.F; DEFERREDLIGHT_RETURN diff --git a/WickedEngine/hairparticlePS_forward.hlsl b/WickedEngine/hairparticlePS_forward.hlsl index 3f96c3058..f41d15c94 100644 --- a/WickedEngine/hairparticlePS_forward.hlsl +++ b/WickedEngine/hairparticlePS_forward.hlsl @@ -29,7 +29,7 @@ GBUFFEROutputType_Thin main(VertexToPixel input) ForwardLighting(surface, diffuse, specular, reflection); - ApplyLighting(surface, diffuse, specular, ao, opacity, color); + ApplyLighting(surface, diffuse, specular, ao, color); ApplyFog(dist, color); diff --git a/WickedEngine/hairparticlePS_tiledforward.hlsl b/WickedEngine/hairparticlePS_tiledforward.hlsl index 9412963dd..7cc976daa 100644 --- a/WickedEngine/hairparticlePS_tiledforward.hlsl +++ b/WickedEngine/hairparticlePS_tiledforward.hlsl @@ -30,7 +30,7 @@ GBUFFEROutputType_Thin main(VertexToPixel input) TiledLighting(pixel, surface, diffuse, specular, reflection); VoxelGI(surface, diffuse, reflection, ao); - ApplyLighting(surface, diffuse, specular, ao, opacity, color); + ApplyLighting(surface, diffuse, specular, ao, color); ApplyFog(dist, color); diff --git a/WickedEngine/lightCullingCS.hlsl b/WickedEngine/lightCullingCS.hlsl index 178f81c64..8b8ce0689 100644 --- a/WickedEngine/lightCullingCS.hlsl +++ b/WickedEngine/lightCullingCS.hlsl @@ -4,6 +4,8 @@ #include "packHF.hlsli" #include "reconstructPositionHF.hlsli" +#define xSSR texture_9 + CBUFFER(DispatchParams, CBSLOT_RENDERER_DISPATCHPARAMS) { uint3 xDispatchParams_numThreadGroups; @@ -478,7 +480,6 @@ void main(ComputeShaderInput IN) iterator = o_decalCount; // decals are not yet available here (need to r/w albedo), skip them for now... - #ifndef DISABLE_ENVMAPS // Apply environment maps: @@ -579,6 +580,12 @@ void main(ComputeShaderInput IN) VoxelGI(surface, diffuse, reflection, ao); + float2 ScreenCoord = (float2)pixel * g_xWorld_ScreenWidthHeight_Inverse; + float2 velocity = g1.zw; + float2 ReprojectedScreenCoord = ScreenCoord + velocity; + float4 ssr = xSSR.SampleLevel(sampler_linear_clamp, ReprojectedScreenCoord, 0); + reflection = lerp(reflection, ssr.rgb, ssr.a); + specular += reflection * surface.F; deferred_Diffuse[pixel] = float4(diffuse, ao); diff --git a/WickedEngine/objectDS.hlsl b/WickedEngine/objectDS.hlsl index 9a36ae83d..bd74c20ac 100644 --- a/WickedEngine/objectDS.hlsl +++ b/WickedEngine/objectDS.hlsl @@ -114,7 +114,7 @@ PixelInputType main(ConstantOutputType input, float3 uvwCoord : SV_DomainLocatio Out.pos3D = vertexPosition.xyz; Out.tex = vertexTex.xy; Out.nor = normalize(vertexNormal.xyz); - Out.nor2D = mul(Out.nor.xyz, (float3x3)g_xCamera_VP).xy; + Out.nor2D = mul(Out.nor.xyz, (float3x3)g_xCamera_View).xy; Out.ReflectionMapSamplingPos = mul(vertexPosition, g_xFrame_MainCamera_ReflVP); diff --git a/WickedEngine/objectHF.hlsli b/WickedEngine/objectHF.hlsli index e37556152..b3c6db9f4 100644 --- a/WickedEngine/objectHF.hlsli +++ b/WickedEngine/objectHF.hlsli @@ -47,6 +47,7 @@ CBUFFER(MaterialCB, CBSLOT_RENDERER_MATERIAL) // DEFINITIONS ////////////////// +// These are bound by wiRenderer (based on Material): #define xBaseColorMap texture_0 #define xNormalMap texture_1 #define xRoughnessMap texture_2 @@ -54,6 +55,7 @@ CBUFFER(MaterialCB, CBSLOT_RENDERER_MATERIAL) #define xMetalnessMap texture_4 #define xDisplacementMap texture_5 +// These are bound by RenderableComponent (based on Render Path): #define xReflection texture_6 #define xRefraction texture_7 #define xWaterRipples texture_8 @@ -95,7 +97,7 @@ inline GBUFFEROutputType CreateGbuffer(in float4 color, in Surface surface, in f { GBUFFEROutputType Out; Out.g0 = float4(color.rgb, 1); /*FORMAT_R8G8B8A8_UNORM*/ - Out.g1 = float4(encode(surface.N), velocity); /*FORMAT_R16G16B16_FLOAT*/ + Out.g1 = float4(encode(surface.N), velocity); /*FORMAT_R16G16B16A16_FLOAT*/ Out.g2 = float4(0, 0, surface.sss, surface.emissive); /*FORMAT_R8G8B8A8_UNORM*/ Out.g3 = float4(surface.roughness, surface.reflectance, surface.metalness, 1); /*FORMAT_R8G8B8A8_UNORM*/ return Out; @@ -109,8 +111,8 @@ struct GBUFFEROutputType_Thin inline GBUFFEROutputType_Thin CreateGbuffer_Thin(in float4 color, in Surface surface, in float2 velocity) { GBUFFEROutputType_Thin Out; - Out.g0 = color; /*FORMAT_R16G16B16_FLOAT*/ - Out.g1 = float4(encode(surface.N), velocity); /*FORMAT_R16G16B16_FLOAT*/ + Out.g0 = color; /*FORMAT_R16G16B16A16_FLOAT*/ + Out.g1 = float4(encode(surface.N), velocity); /*FORMAT_R16G16B16A16_FLOAT*/ return Out; } @@ -179,7 +181,7 @@ inline void Refraction(in float2 ScreenCoord, in float2 normal2D, in float3 bump xRefraction.GetDimensions(0, size.x, size.y, mipLevels); float2 perturbatedRefrTexCoords = ScreenCoord.xy + (normal2D + bumpColor.rg) * g_xMat_refractionIndex; float4 refractiveColor = xRefraction.SampleLevel(sampler_linear_clamp, perturbatedRefrTexCoords, (g_xWorld_AdvancedRefractions ? surface.roughness * mipLevels : 0)); - surface.albedo.rgb = lerp(refractiveColor.rgb, surface.albedo.rgb, color.a); + surface.albedo.rgb *= lerp(refractiveColor.rgb, 1, color.a); color.a = 1; } @@ -407,9 +409,9 @@ inline void TiledLighting(in float2 pixel, inout Surface surface, inout float3 d } } -inline void ApplyLighting(in Surface surface, in float3 diffuse, in float3 specular, in float ao, in float opacity, inout float4 color) +inline void ApplyLighting(in Surface surface, in float3 diffuse, in float3 specular, in float ao, inout float4 color) { - color.rgb = lerp(1, GetAmbientColor() * ao + diffuse, opacity) * surface.albedo + specular; + color.rgb = (GetAmbientColor() * ao + diffuse) * surface.albedo + specular; } inline void ApplyFog(in float dist, inout float4 color) @@ -570,10 +572,6 @@ GBUFFEROutputType_Thin main(PIXELINPUT input) #ifndef DEFERRED -#ifdef TRANSPARENT - Refraction(ScreenCoord, input.nor2D, bumpColor, surface, color); -#endif // TRANSPARENT - #ifdef FORWARD ForwardLighting(surface, diffuse, specular, reflection); #endif // FORWARD @@ -592,17 +590,24 @@ GBUFFEROutputType_Thin main(PIXELINPUT input) reflection = PlanarReflection(refUV, surface); #endif + +#ifdef TRANSPARENT + Refraction(ScreenCoord, input.nor2D, bumpColor, surface, color); + diffuse = lerp(1, diffuse, opacity); +#else float4 ssr = xSSR.SampleLevel(sampler_linear_clamp, ReprojectedScreenCoord, 0); reflection = lerp(reflection, ssr.rgb, ssr.a); float ssao = xSSAO.SampleLevel(sampler_linear_clamp, ReprojectedScreenCoord, 0).r; ao *= ssao; +#endif // TRANSPARENT + #endif // ENVMAPRENDERING #endif // WATER specular += reflection * surface.F; - ApplyLighting(surface, diffuse, specular, ao, opacity, color); + ApplyLighting(surface, diffuse, specular, ao, color); #ifdef WATER // SOFT EDGE diff --git a/WickedEngine/objectVS_common.hlsl b/WickedEngine/objectVS_common.hlsl index b337e28aa..f4b602b71 100644 --- a/WickedEngine/objectVS_common.hlsl +++ b/WickedEngine/objectVS_common.hlsl @@ -28,7 +28,7 @@ PixelInputType main(Input_Object_ALL input) Out.pos3D = surface.position.xyz; Out.tex = surface.uv; Out.nor = surface.normal; - Out.nor2D = mul(Out.nor.xyz, (float3x3)g_xCamera_VP).xy; + Out.nor2D = mul(Out.nor.xyz, (float3x3)g_xCamera_View).xy; Out.ReflectionMapSamplingPos = mul(surface.position, g_xFrame_MainCamera_ReflVP); diff --git a/WickedEngine/oceanSurfacePS.hlsl b/WickedEngine/oceanSurfacePS.hlsl index d81e7f219..1952c2950 100644 --- a/WickedEngine/oceanSurfacePS.hlsl +++ b/WickedEngine/oceanSurfacePS.hlsl @@ -55,7 +55,7 @@ float4 main(PSIn input) : SV_TARGET specular += reflection * fresnelTerm; - ApplyLighting(surface, diffuse, specular, ao, opacity, color); + ApplyLighting(surface, diffuse, specular, ao, color); //SOFT EDGE float fade = saturate(0.3 * abs(refDepth - lineardepth)); diff --git a/WickedEngine/shadowPS_transparent.hlsl b/WickedEngine/shadowPS_transparent.hlsl index 960dee0a3..aeca0f6a5 100644 --- a/WickedEngine/shadowPS_transparent.hlsl +++ b/WickedEngine/shadowPS_transparent.hlsl @@ -22,8 +22,7 @@ float4 main(VertextoPixel input) : SV_TARGET ALPHATEST(color.a); float opacity = color.a; - // When opacity reaches ZERO, the multiplicative light mask will be ONE: - color.rgb = lerp(1, color.rgb, opacity); + color.rgb *= 1 - opacity; // Use the alpha channel for refraction caustics effect: float3 bumpColor; diff --git a/WickedEngine/ssao.hlsl b/WickedEngine/ssao.hlsl index 435156ef1..60d810163 100644 --- a/WickedEngine/ssao.hlsl +++ b/WickedEngine/ssao.hlsl @@ -76,7 +76,7 @@ float4 main(VertexToPixelPostProcess input):SV_Target } - float ao = 1.0 - bl * invSamples*darkness; + float ao = 1.0 - bl * invSamples/**darkness*/; return saturate(ao.xxxx); } \ No newline at end of file diff --git a/WickedEngine/ssr.hlsl b/WickedEngine/ssr.hlsl index 0b8813edd..bc1cb76a2 100644 --- a/WickedEngine/ssr.hlsl +++ b/WickedEngine/ssr.hlsl @@ -110,6 +110,6 @@ float4 main(VertexToPixelPostProcess input) : SV_Target float3 reflectionColor = xTexture.SampleLevel(sampler_linear_clamp, vCoords.xy, 0).rgb; - return float4(reflectionColor, reflectionIntensity); + return max(0, float4(reflectionColor, reflectionIntensity)); } diff --git a/WickedEngine/waterVS.hlsl b/WickedEngine/waterVS.hlsl index 594db5b66..541f0e39d 100644 --- a/WickedEngine/waterVS.hlsl +++ b/WickedEngine/waterVS.hlsl @@ -13,7 +13,7 @@ PixelInputType main(Input_Object_POS_TEX input) Out.pos = Out.pos2D = mul(surface.position, g_xCamera_VP); Out.tex = surface.uv; Out.nor = normalize(mul(surface.normal, (float3x3)WORLD)); - Out.nor2D = mul(Out.nor.xyz, (float3x3)g_xCamera_VP).xy; + Out.nor2D = mul(Out.nor.xyz, (float3x3)g_xCamera_View).xy; Out.ReflectionMapSamplingPos = mul(surface.position, g_xFrame_MainCamera_ReflVP); diff --git a/WickedEngine/wiRenderer.cpp b/WickedEngine/wiRenderer.cpp index 8a15da58b..8d526582f 100644 --- a/WickedEngine/wiRenderer.cpp +++ b/WickedEngine/wiRenderer.cpp @@ -5278,8 +5278,7 @@ void wiRenderer::RenderMeshes(const XMFLOAT3& eye, const CulledCollection& culle } } -void wiRenderer::DrawWorld(Camera* camera, bool tessellation, GRAPHICSTHREAD threadID, SHADERTYPE shaderType, - Texture2D* refRes, Texture2D* ssaoRes, Texture2D* ssrRes, bool grass, bool occlusionCulling) +void wiRenderer::DrawWorld(Camera* camera, bool tessellation, GRAPHICSTHREAD threadID, SHADERTYPE shaderType, bool grass, bool occlusionCulling) { const FrameCulling& culling = frameCullings[camera]; @@ -5302,30 +5301,6 @@ void wiRenderer::DrawWorld(Camera* camera, bool tessellation, GRAPHICSTHREAD thr if (!culledRenderer.empty() || (grass && culling.culledHairParticleSystems.empty())) { - if (!wireRender) - { - if (refRes != nullptr) - { - GetDevice()->BindResource(PS, refRes, TEXSLOT_ONDEMAND6, threadID); - } - if (ssaoRes != nullptr) - { - GetDevice()->BindResource(PS, ssaoRes, TEXSLOT_ONDEMAND8, threadID); - } - else - { - GetDevice()->BindResource(PS, wiTextureHelper::getInstance()->getWhite(), TEXSLOT_ONDEMAND8, threadID); - } - if (ssrRes != nullptr) - { - GetDevice()->BindResource(PS, ssrRes, TEXSLOT_ONDEMAND9, threadID); - } - else - { - GetDevice()->BindResource(PS, wiTextureHelper::getInstance()->getTransparent(), TEXSLOT_ONDEMAND9, threadID); - } - } - RenderMeshes(camera->translation, culledRenderer, shaderType, RENDERTYPE_OPAQUE, threadID, tessellation, GetOcclusionCullingEnabled() && occlusionCulling); } @@ -5333,8 +5308,7 @@ void wiRenderer::DrawWorld(Camera* camera, bool tessellation, GRAPHICSTHREAD thr } -void wiRenderer::DrawWorldTransparent(Camera* camera, SHADERTYPE shaderType, Texture2D* refracRes, Texture2D* refRes - , Texture2D* waterRippleNormals, GRAPHICSTHREAD threadID, bool grass, bool occlusionCulling) +void wiRenderer::DrawWorldTransparent(Camera* camera, SHADERTYPE shaderType, GRAPHICSTHREAD threadID, bool grass, bool occlusionCulling) { const FrameCulling& culling = frameCullings[camera]; @@ -5347,13 +5321,6 @@ void wiRenderer::DrawWorldTransparent(Camera* camera, SHADERTYPE shaderType, Tex GetDevice()->BindResource(PS, resourceBuffers[RBTYPE_ENTITYINDEXLIST_TRANSPARENT], SBSLOT_ENTITYINDEXLIST, threadID); } - if (!wireRender) - { - GetDevice()->BindResource(PS, refRes, TEXSLOT_ONDEMAND6, threadID); - GetDevice()->BindResource(PS, refracRes, TEXSLOT_ONDEMAND7, threadID); - GetDevice()->BindResource(PS, waterRippleNormals, TEXSLOT_ONDEMAND8, threadID); - } - if (ocean != nullptr) { ocean->Render(camera, renderTime, threadID); diff --git a/WickedEngine/wiRenderer.h b/WickedEngine/wiRenderer.h index f1e3bf961..64600c528 100644 --- a/WickedEngine/wiRenderer.h +++ b/WickedEngine/wiRenderer.h @@ -454,11 +454,9 @@ public: static void RenderMeshes(const XMFLOAT3& eye, const CulledCollection& culledRenderer, SHADERTYPE shaderType, UINT renderTypeFlags, GRAPHICSTHREAD threadID, bool tessellation = false, bool occlusionCulling = false); static void DrawSky(GRAPHICSTHREAD threadID); static void DrawSun(GRAPHICSTHREAD threadID); - static void DrawWorld(Camera* camera, bool tessellation, GRAPHICSTHREAD threadID, SHADERTYPE shaderType, - wiGraphicsTypes::Texture2D* refRes, wiGraphicsTypes::Texture2D* ssaoRes, wiGraphicsTypes::Texture2D* ssrRes, bool grass, bool occlusionCulling); + static void DrawWorld(Camera* camera, bool tessellation, GRAPHICSTHREAD threadID, SHADERTYPE shaderType, bool grass, bool occlusionCulling); static void DrawForShadowMap(GRAPHICSTHREAD threadID); - static void DrawWorldTransparent(Camera* camera, SHADERTYPE shaderType, wiGraphicsTypes::Texture2D* refracRes, wiGraphicsTypes::Texture2D* refRes - , wiGraphicsTypes::Texture2D* waterRippleNormals, GRAPHICSTHREAD threadID, bool grass, bool occlusionCulling); + static void DrawWorldTransparent(Camera* camera, SHADERTYPE shaderType, GRAPHICSTHREAD threadID, bool grass, bool occlusionCulling); void DrawDebugSpheres(Camera* camera, GRAPHICSTHREAD threadID); static void DrawDebugBoneLines(Camera* camera, GRAPHICSTHREAD threadID); static void DrawDebugLines(Camera* camera, GRAPHICSTHREAD threadID); diff --git a/WickedEngine/wiVersion.cpp b/WickedEngine/wiVersion.cpp index 35ec1104f..ab96c529e 100644 --- a/WickedEngine/wiVersion.cpp +++ b/WickedEngine/wiVersion.cpp @@ -9,7 +9,7 @@ namespace wiVersion // minor features, major updates const int minor = 16; // minor bug fixes, alterations, refactors, updates - const int revision = 14; + const int revision = 15; long GetVersion()