From 2e5be71f17c22973caf27f99400af780ba62ceda Mon Sep 17 00:00:00 2001 From: turanszkij Date: Wed, 19 Oct 2016 01:09:50 +0200 Subject: [PATCH] implemented alpha composition rendering for hair particle systems; implemented controllable alpharef for alpha testing behaviour; --- WickedEngine/DeferredRenderableComponent.cpp | 7 +- .../DeferredRenderableComponent_BindLua.cpp | 1 + WickedEngine/ForwardRenderableComponent.cpp | 8 +- WickedEngine/ForwardRenderableComponent.h | 2 + .../ForwardRenderableComponent_BindLua.cpp | 2 + WickedEngine/MaterialWindow.cpp | 12 ++- WickedEngine/MaterialWindow.h | 1 + WickedEngine/Renderable3DComponent.h | 4 + .../Renderable3DComponent_BindLua.cpp | 16 ++++ WickedEngine/Renderable3DComponent_BindLua.h | 1 + .../TiledForwardRenderableComponent.cpp | 16 +++- WickedEngine/globals.hlsli | 4 +- WickedEngine/grassPS_tiledforward.hlsl | 1 + WickedEngine/qGrassPS_tiledforward.hlsl | 1 - WickedEngine/wiEnums.h | 3 +- WickedEngine/wiHairParticle.cpp | 2 - WickedEngine/wiLoader.h | 4 + WickedEngine/wiRenderer.cpp | 96 ++++++++++++------- WickedEngine/wiRenderer.h | 6 ++ WickedEngine/wiVersion.cpp | 2 +- 20 files changed, 141 insertions(+), 48 deletions(-) diff --git a/WickedEngine/DeferredRenderableComponent.cpp b/WickedEngine/DeferredRenderableComponent.cpp index 7d967b47c..93c44baa9 100644 --- a/WickedEngine/DeferredRenderableComponent.cpp +++ b/WickedEngine/DeferredRenderableComponent.cpp @@ -9,15 +9,18 @@ using namespace wiGraphicsTypes; -DeferredRenderableComponent::DeferredRenderableComponent(){ +DeferredRenderableComponent::DeferredRenderableComponent() +{ Renderable3DComponent::setProperties(); setSSREnabled(true); setSSAOEnabled(true); + setHairParticleAlphaCompositionEnabled(false); setPreferredThreadingCount(0); } -DeferredRenderableComponent::~DeferredRenderableComponent(){ +DeferredRenderableComponent::~DeferredRenderableComponent() +{ } void DeferredRenderableComponent::Initialize() { diff --git a/WickedEngine/DeferredRenderableComponent_BindLua.cpp b/WickedEngine/DeferredRenderableComponent_BindLua.cpp index 04c72cde2..c9cc3f0a1 100644 --- a/WickedEngine/DeferredRenderableComponent_BindLua.cpp +++ b/WickedEngine/DeferredRenderableComponent_BindLua.cpp @@ -49,6 +49,7 @@ Luna::FunctionType DeferredRenderableCompon lunamethod(Renderable3DComponent_BindLua, SetStereogramEnabled), lunamethod(Renderable3DComponent_BindLua, SetEyeAdaptionEnabled), lunamethod(Renderable3DComponent_BindLua, SetTessellationEnabled), + lunamethod(Renderable3DComponent_BindLua, SetHairParticleAlphaCompositionEnabled), lunamethod(Renderable3DComponent_BindLua, SetDepthOfFieldFocus), lunamethod(Renderable3DComponent_BindLua, SetDepthOfFieldStrength), diff --git a/WickedEngine/ForwardRenderableComponent.cpp b/WickedEngine/ForwardRenderableComponent.cpp index ab1af2b2b..817a2d456 100644 --- a/WickedEngine/ForwardRenderableComponent.cpp +++ b/WickedEngine/ForwardRenderableComponent.cpp @@ -6,16 +6,18 @@ using namespace wiGraphicsTypes; -ForwardRenderableComponent::ForwardRenderableComponent(){ +ForwardRenderableComponent::ForwardRenderableComponent() +{ Renderable3DComponent::setProperties(); setSSREnabled(false); setSSAOEnabled(false); - setShadowsEnabled(true); + setShadowsEnabled(false); setPreferredThreadingCount(0); } -ForwardRenderableComponent::~ForwardRenderableComponent(){ +ForwardRenderableComponent::~ForwardRenderableComponent() +{ } void ForwardRenderableComponent::Initialize() { diff --git a/WickedEngine/ForwardRenderableComponent.h b/WickedEngine/ForwardRenderableComponent.h index e024547fc..ab9b1d4be 100644 --- a/WickedEngine/ForwardRenderableComponent.h +++ b/WickedEngine/ForwardRenderableComponent.h @@ -9,11 +9,13 @@ protected: wiRenderTarget rtMain; + virtual void RenderScene(GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE) override; public: ForwardRenderableComponent(); virtual ~ForwardRenderableComponent(); + virtual void setPreferredThreadingCount(unsigned short value) override; virtual void Initialize() override; diff --git a/WickedEngine/ForwardRenderableComponent_BindLua.cpp b/WickedEngine/ForwardRenderableComponent_BindLua.cpp index c5589e74e..af3cb4da2 100644 --- a/WickedEngine/ForwardRenderableComponent_BindLua.cpp +++ b/WickedEngine/ForwardRenderableComponent_BindLua.cpp @@ -49,6 +49,8 @@ Luna::FunctionType ForwardRenderableComponen lunamethod(Renderable3DComponent_BindLua, SetStereogramEnabled), lunamethod(Renderable3DComponent_BindLua, SetEyeAdaptionEnabled), lunamethod(Renderable3DComponent_BindLua, SetTessellationEnabled), + lunamethod(Renderable3DComponent_BindLua, SetMSAASampleCount), + lunamethod(Renderable3DComponent_BindLua, SetHairParticleAlphaCompositionEnabled), lunamethod(Renderable3DComponent_BindLua, SetDepthOfFieldFocus), lunamethod(Renderable3DComponent_BindLua, SetDepthOfFieldStrength), diff --git a/WickedEngine/MaterialWindow.cpp b/WickedEngine/MaterialWindow.cpp index c6e840183..4346e9147 100644 --- a/WickedEngine/MaterialWindow.cpp +++ b/WickedEngine/MaterialWindow.cpp @@ -12,7 +12,7 @@ MaterialWindow::MaterialWindow(wiGUI* gui) : GUI(gui) float screenH = (float)wiRenderer::GetDevice()->GetScreenHeight(); materialWindow = new wiWindow(GUI, "Material Window"); - materialWindow->SetSize(XMFLOAT2(600, 570)); + materialWindow->SetSize(XMFLOAT2(600, 600)); materialWindow->SetEnabled(false); GUI->AddWidget(materialWindow); @@ -86,6 +86,14 @@ MaterialWindow::MaterialWindow(wiGUI* gui) : GUI(gui) }); materialWindow->AddWidget(alphaSlider); + alphaRefSlider = new wiSlider(0, 1, 1.0f, 1000, "AlphaRef: "); + alphaRefSlider->SetSize(XMFLOAT2(100, 30)); + alphaRefSlider->SetPos(XMFLOAT2(x, y += step)); + alphaRefSlider->OnSlide([&](wiEventArgs args) { + material->alphaRef = args.fValue; + }); + materialWindow->AddWidget(alphaRefSlider); + refractionIndexSlider = new wiSlider(0, 1.0f, 0.02f, 1000, "Refraction Index: "); refractionIndexSlider->SetSize(XMFLOAT2(100, 30)); refractionIndexSlider->SetPos(XMFLOAT2(x, y += step)); @@ -177,6 +185,7 @@ MaterialWindow::~MaterialWindow() SAFE_DELETE(movingTexSliderV); SAFE_DELETE(colorPickerToggleButton); SAFE_DELETE(colorPicker); + SAFE_DELETE(alphaRefSlider); } @@ -201,6 +210,7 @@ void MaterialWindow::SetMaterial(Material* mat) pomSlider->SetValue(material->parallaxOcclusionMapping); movingTexSliderU->SetValue(material->movingTex.x); movingTexSliderU->SetValue(material->movingTex.x); + alphaRefSlider->SetValue(material->alphaRef); materialWindow->SetEnabled(true); colorPicker->SetEnabled(true); } diff --git a/WickedEngine/MaterialWindow.h b/WickedEngine/MaterialWindow.h index 8dcdf5857..60518d5b6 100644 --- a/WickedEngine/MaterialWindow.h +++ b/WickedEngine/MaterialWindow.h @@ -39,5 +39,6 @@ public: wiSlider* movingTexSliderV; wiButton* colorPickerToggleButton; wiColorPicker* colorPicker; + wiSlider* alphaRefSlider; }; diff --git a/WickedEngine/Renderable3DComponent.h b/WickedEngine/Renderable3DComponent.h index 17e6890a7..831df0a9f 100644 --- a/WickedEngine/Renderable3DComponent.h +++ b/WickedEngine/Renderable3DComponent.h @@ -42,6 +42,7 @@ private: bool stereogramEnabled; bool eyeAdaptionEnabled; bool tessellationEnabled; + bool hairParticleAlphaComposition; UINT msaaSampleCount; @@ -109,6 +110,7 @@ public: inline bool getStereogramEnabled() { return stereogramEnabled; } inline bool getEyeAdaptionEnabled() { return eyeAdaptionEnabled; } inline bool getTessellationEnabled() { return tessellationEnabled && wiRenderer::GetDevice()->CheckCapability(wiGraphicsTypes::GraphicsDevice::GRAPHICSDEVICE_CAPABILITY_TESSELLATION); } + inline bool getHairParticleAlphaCompositionEnabled() { return hairParticleAlphaComposition; } inline UINT getMSAASampleCount() { return msaaSampleCount; } @@ -146,6 +148,8 @@ public: inline void setStereogramEnabled(bool value) { stereogramEnabled = value; } inline void setEyeAdaptionEnabled(bool value) { eyeAdaptionEnabled = value; } inline void setTessellationEnabled(bool value) { tessellationEnabled = value; } + // Render hair particle systems in two passes to achieve smooth alpha blending (tiledforward only yet) + inline void setHairParticleAlphaCompositionEnabled(bool value) { hairParticleAlphaComposition = value; } inline void setMSAASampleCount(UINT value) { msaaSampleCount = value; } diff --git a/WickedEngine/Renderable3DComponent_BindLua.cpp b/WickedEngine/Renderable3DComponent_BindLua.cpp index e3e57737e..5b4706550 100644 --- a/WickedEngine/Renderable3DComponent_BindLua.cpp +++ b/WickedEngine/Renderable3DComponent_BindLua.cpp @@ -51,6 +51,7 @@ Luna::FunctionType Renderable3DComponent_BindLua: lunamethod(Renderable3DComponent_BindLua, SetEyeAdaptionEnabled), lunamethod(Renderable3DComponent_BindLua, SetTessellationEnabled), lunamethod(Renderable3DComponent_BindLua, SetMSAASampleCount), + lunamethod(Renderable3DComponent_BindLua, SetHairParticleAlphaCompositionEnabled), lunamethod(Renderable3DComponent_BindLua, SetDepthOfFieldFocus), lunamethod(Renderable3DComponent_BindLua, SetDepthOfFieldStrength), @@ -347,6 +348,21 @@ int Renderable3DComponent_BindLua::SetMSAASampleCount(lua_State* L) wiLua::SError(L, "SetMSAASampleCount(int value) not enough arguments!"); return 0; } +int Renderable3DComponent_BindLua::SetHairParticleAlphaCompositionEnabled(lua_State* L) +{ + if (component == nullptr) + { + wiLua::SError(L, "SetHairParticleAlphaCompositionEnabled(bool value) component is null!"); + return 0; + } + if (wiLua::SGetArgCount(L) > 0) + { + ((Renderable3DComponent*)component)->setHairParticleAlphaCompositionEnabled(wiLua::SGetBool(L, 1)); + } + else + wiLua::SError(L, "SetHairParticleAlphaCompositionEnabled(bool value) not enough arguments!"); + return 0; +} int Renderable3DComponent_BindLua::SetDepthOfFieldFocus(lua_State* L) diff --git a/WickedEngine/Renderable3DComponent_BindLua.h b/WickedEngine/Renderable3DComponent_BindLua.h index e526e2bbf..dd558f2ff 100644 --- a/WickedEngine/Renderable3DComponent_BindLua.h +++ b/WickedEngine/Renderable3DComponent_BindLua.h @@ -35,6 +35,7 @@ public: int SetEyeAdaptionEnabled(lua_State* L); int SetTessellationEnabled(lua_State* L); int SetMSAASampleCount(lua_State* L); + int SetHairParticleAlphaCompositionEnabled(lua_State* L); int SetDepthOfFieldFocus(lua_State* L); int SetDepthOfFieldStrength(lua_State* L); diff --git a/WickedEngine/TiledForwardRenderableComponent.cpp b/WickedEngine/TiledForwardRenderableComponent.cpp index b6a8e1605..708c70834 100644 --- a/WickedEngine/TiledForwardRenderableComponent.cpp +++ b/WickedEngine/TiledForwardRenderableComponent.cpp @@ -6,11 +6,14 @@ using namespace wiGraphicsTypes; -TiledForwardRenderableComponent::TiledForwardRenderableComponent() { +TiledForwardRenderableComponent::TiledForwardRenderableComponent() +{ ForwardRenderableComponent::setProperties(); setShadowsEnabled(true); + setHairParticleAlphaCompositionEnabled(true); } -TiledForwardRenderableComponent::~TiledForwardRenderableComponent() { +TiledForwardRenderableComponent::~TiledForwardRenderableComponent() +{ } void TiledForwardRenderableComponent::RenderScene(GRAPHICSTHREAD threadID) @@ -19,6 +22,10 @@ void TiledForwardRenderableComponent::RenderScene(GRAPHICSTHREAD threadID) rtMain.Activate(threadID, 0, 0, 0, 0, true); // depth prepass { + if (getHairParticleAlphaCompositionEnabled()) + { + wiRenderer::SetAlphaRef(0.1f, threadID); + } wiRenderer::DrawWorld(wiRenderer::getCamera(), getTessellationEnabled(), threadID, SHADERTYPE_ALPHATESTONLY, nullptr, true); } @@ -47,9 +54,10 @@ void TiledForwardRenderableComponent::RenderScene(GRAPHICSTHREAD threadID) } void TiledForwardRenderableComponent::RenderTransparentScene(wiRenderTarget& mainRT, wiRenderTarget& shadedSceneRT, GRAPHICSTHREAD threadID) { - rtTransparent.Activate(threadID, mainRT.depth); { + rtTransparent.Activate(threadID, mainRT.depth); + { wiRenderer::DrawWorldTransparent(wiRenderer::getCamera(), SHADERTYPE_TILEDFORWARD, shadedSceneRT.GetTexture(), rtReflection.GetTexture() - , rtWaterRipple.GetTexture(), threadID, false); + , rtWaterRipple.GetTexture(), threadID, getHairParticleAlphaCompositionEnabled()); wiRenderer::DrawTrails(threadID, shadedSceneRT.GetTexture()); } } diff --git a/WickedEngine/globals.hlsli b/WickedEngine/globals.hlsli index 2fe91c3ac..5cf284ab7 100644 --- a/WickedEngine/globals.hlsli +++ b/WickedEngine/globals.hlsli @@ -100,6 +100,8 @@ CBUFFER(MiscCB, CBSLOT_RENDERER_MISC) CBUFFER(APICB, CBSLOT_API) { float4 g_xClipPlane; + float g_xAlphaRef; + float3 g_xPadding0_APICB; }; static const float PI = 3.14159265358979323846; @@ -109,7 +111,7 @@ static const float PI = 3.14159265358979323846; #ifdef DISABLE_ALPHATEST #define ALPHATEST(x) #else -#define ALPHATEST(x) clip((x)-0.1); +#define ALPHATEST(x) clip((x) - (1.0f - g_xAlphaRef)); #endif static const float g_GammaValue = 2.2; diff --git a/WickedEngine/grassPS_tiledforward.hlsl b/WickedEngine/grassPS_tiledforward.hlsl index ae52d237d..1cb6f0ae1 100644 --- a/WickedEngine/grassPS_tiledforward.hlsl +++ b/WickedEngine/grassPS_tiledforward.hlsl @@ -2,6 +2,7 @@ #include "grassHF_PS.hlsli" #include "ditherHF.hlsli" +[earlydepthstencil] float4 main(GS_OUT PSIn) : SV_Target { float4 color = float4(PSIn.col,1); diff --git a/WickedEngine/qGrassPS_tiledforward.hlsl b/WickedEngine/qGrassPS_tiledforward.hlsl index c11fca1dd..b2ddc3c90 100644 --- a/WickedEngine/qGrassPS_tiledforward.hlsl +++ b/WickedEngine/qGrassPS_tiledforward.hlsl @@ -7,7 +7,6 @@ float4 main(QGS_OUT PSIn) : SV_Target { float4 color = texture_0.Sample(sampler_linear_clamp,PSIn.tex); color = DEGAMMA(color); - color.a = 1; // do not blend float3 P = PSIn.pos3D; float3 V = normalize(g_xCamera_CamPos - P); float emissive = 0; diff --git a/WickedEngine/wiEnums.h b/WickedEngine/wiEnums.h index 699575160..369a71e21 100644 --- a/WickedEngine/wiEnums.h +++ b/WickedEngine/wiEnums.h @@ -70,7 +70,7 @@ enum CBTYPES CBTYPE_VOLUMELIGHT, CBTYPE_DECAL, CBTYPE_CUBEMAPRENDER, - CBTYPE_CLIPPLANE, + CBTYPE_API, CBTYPE_TESSELLATION, CBTYPE_DISPATCHPARAMS, CBTYPE_LAST @@ -240,6 +240,7 @@ enum DSSTYPES DSSTYPE_LIGHT, DSSTYPE_STENCILREAD_MATCH, DSSTYPE_DEPTHREADEQUAL, + DSSTYPE_HAIRALPHACOMPOSITION, DSSTYPE_LAST }; // blend states diff --git a/WickedEngine/wiHairParticle.cpp b/WickedEngine/wiHairParticle.cpp index d78de4859..48bda35d0 100644 --- a/WickedEngine/wiHairParticle.cpp +++ b/WickedEngine/wiHairParticle.cpp @@ -415,8 +415,6 @@ void wiHairParticle::Draw(Camera* camera, SHADERTYPE shaderType, GRAPHICSTHREAD { device->BindResourcePS(texture,TEXSLOT_ONDEMAND0,threadID); device->BindResourceGS(texture,TEXSLOT_ONDEMAND0,threadID); - - device->BindBlendState(bs,threadID); } else device->BindRasterizerState(ncrs,threadID); diff --git a/WickedEngine/wiLoader.h b/WickedEngine/wiLoader.h index 52eeeeada..c4e949f20 100644 --- a/WickedEngine/wiLoader.h +++ b/WickedEngine/wiLoader.h @@ -152,6 +152,8 @@ struct Material bool planar_reflections; + float alphaRef; + Material() { @@ -207,6 +209,8 @@ struct Material parallaxOcclusionMapping = 0.0f; planar_reflections = false; + + alphaRef = 0.75f; } bool IsTransparent() const { return alpha < 1.0f; } diff --git a/WickedEngine/wiRenderer.cpp b/WickedEngine/wiRenderer.cpp index cff7223b3..d54d8656f 100644 --- a/WickedEngine/wiRenderer.cpp +++ b/WickedEngine/wiRenderer.cpp @@ -568,7 +568,7 @@ void wiRenderer::LoadBuffers() GetDevice()->CreateBuffer(&bd, nullptr, constantBuffers[CBTYPE_MISC]); bd.ByteWidth = sizeof(APICB); - GetDevice()->CreateBuffer(&bd, nullptr, constantBuffers[CBTYPE_CLIPPLANE]); + GetDevice()->CreateBuffer(&bd, nullptr, constantBuffers[CBTYPE_API]); // On demand buffers... @@ -1118,6 +1118,12 @@ void wiRenderer::SetUpStates() GetDevice()->CreateDepthStencilState(&dsd, depthStencils[DSSTYPE_DEPTHREADEQUAL]); + dsd.DepthEnable = true; + dsd.DepthWriteMask = DEPTH_WRITE_MASK_ZERO; + dsd.DepthFunc = COMPARISON_LESS; + GetDevice()->CreateDepthStencilState(&dsd, depthStencils[DSSTYPE_HAIRALPHACOMPOSITION]); + + for (int i = 0; i < BSTYPE_LAST; ++i) { blendStates[i] = new BlendState; @@ -1210,7 +1216,8 @@ void wiRenderer::BindPersistentState(GRAPHICSTHREAD threadID) GetDevice()->BindConstantBufferHS(constantBuffers[CBTYPE_MISC], CB_GETBINDSLOT(MiscCB), threadID); GetDevice()->BindConstantBufferCS(constantBuffers[CBTYPE_MISC], CB_GETBINDSLOT(MiscCB), threadID); - GetDevice()->BindConstantBufferVS(constantBuffers[CBTYPE_CLIPPLANE], CB_GETBINDSLOT(APICB), threadID); + GetDevice()->BindConstantBufferVS(constantBuffers[CBTYPE_API], CB_GETBINDSLOT(APICB), threadID); + GetDevice()->BindConstantBufferPS(constantBuffers[CBTYPE_API], CB_GETBINDSLOT(APICB), threadID); GetDevice()->BindResourcePS(resourceBuffers[RBTYPE_LIGHTARRAY], STRUCTUREDBUFFER_GETBINDSLOT(LightArrayType), threadID); GetDevice()->BindResourceCS(resourceBuffers[RBTYPE_LIGHTARRAY], STRUCTUREDBUFFER_GETBINDSLOT(LightArrayType), threadID); @@ -2943,7 +2950,6 @@ PSTYPES GetPSTYPE(SHADERTYPE shaderType, const Material* const material) void wiRenderer::RenderMeshes(const XMFLOAT3& eye, const CulledCollection& culledRenderer, SHADERTYPE shaderType, UINT renderTypeFlags, GRAPHICSTHREAD threadID, bool tessellation) { - if (!culledRenderer.empty()) { GetDevice()->EventBegin(L"RenderMeshes", threadID); @@ -3247,6 +3253,8 @@ void wiRenderer::RenderMeshes(const XMFLOAT3& eye, const CulledCollection& culle GetDevice()->BindResourceDS(material->GetDisplacementMap(), TEXSLOT_ONDEMAND5, threadID); } + SetAlphaRef(material->alphaRef, threadID); + GetDevice()->DrawIndexedInstanced((int)subset.subsetIndices.size(), k, threadID); } } @@ -3260,6 +3268,8 @@ void wiRenderer::RenderMeshes(const XMFLOAT3& eye, const CulledCollection& culle GetDevice()->BindDS(nullptr, threadID); GetDevice()->BindHS(nullptr, threadID); + ResetAlphaRef(threadID); + wiRenderer::GetDevice()->EventEnd(threadID); } } @@ -3270,10 +3280,26 @@ void wiRenderer::DrawWorld(Camera* camera, bool tessellation, GRAPHICSTHREAD thr const FrameCulling& culling = frameCullings[camera]; const CulledCollection& culledRenderer = culling.culledRenderer; + GetDevice()->EventBegin(L"DrawWorld"); + + if (shaderType == SHADERTYPE_TILEDFORWARD) + { + GetDevice()->BindResourcePS(resourceBuffers[RBTYPE_LIGHTINDEXLIST_OPAQUE], SBSLOT_LIGHTINDEXLIST, threadID); + GetDevice()->BindResourcePS(textures[TEXTYPE_2D_LIGHTGRID_OPAQUE], TEXSLOT_LIGHTGRID, threadID); + } + + if (grass) + { + GetDevice()->BindDepthStencilState(depthStencils[shaderType == SHADERTYPE_TILEDFORWARD ? DSSTYPE_DEPTHREADEQUAL : DSSTYPE_DEFAULT], STENCILREF_DEFAULT, threadID); + GetDevice()->BindBlendState(blendStates[BSTYPE_OPAQUE], threadID); + for (wiHairParticle* hair : culling.culledHairParticleSystems) + { + hair->Draw(camera, shaderType, threadID); + } + } + if (!culledRenderer.empty() || (grass && culling.culledHairParticleSystems.empty())) { - GetDevice()->EventBegin(L"DrawWorld"); - if (!wireRender) { if (refRes != nullptr) @@ -3282,26 +3308,11 @@ void wiRenderer::DrawWorld(Camera* camera, bool tessellation, GRAPHICSTHREAD thr } } - if (shaderType == SHADERTYPE_TILEDFORWARD) - { - GetDevice()->BindResourcePS(resourceBuffers[RBTYPE_LIGHTINDEXLIST_OPAQUE], SBSLOT_LIGHTINDEXLIST, threadID); - GetDevice()->BindResourcePS(textures[TEXTYPE_2D_LIGHTGRID_OPAQUE], TEXSLOT_LIGHTGRID, threadID); - } - - if (grass) - { - GetDevice()->BindDepthStencilState(depthStencils[shaderType == SHADERTYPE_TILEDFORWARD ? DSSTYPE_DEPTHREADEQUAL : DSSTYPE_DEFAULT], STENCILREF_DEFAULT, threadID); - for (wiHairParticle* hair : culling.culledHairParticleSystems) - { - hair->Draw(camera, shaderType, threadID); - } - } - RenderMeshes(camera->translation, culledRenderer, shaderType, RENDERTYPE_OPAQUE, threadID, tessellation); - - GetDevice()->EventEnd(); } + GetDevice()->EventEnd(); + } void wiRenderer::DrawWorldTransparent(Camera* camera, SHADERTYPE shaderType, Texture2D* refracRes, Texture2D* refRes @@ -3311,9 +3322,26 @@ void wiRenderer::DrawWorldTransparent(Camera* camera, SHADERTYPE shaderType, Tex const FrameCulling& culling = frameCullings[camera]; const CulledCollection& culledRenderer = culling.culledRenderer_transparent; + GetDevice()->EventBegin(L"DrawWorldTransparent"); + + if (shaderType == SHADERTYPE_TILEDFORWARD) + { + GetDevice()->BindResourcePS(resourceBuffers[RBTYPE_LIGHTINDEXLIST_TRANSPARENT], SBSLOT_LIGHTINDEXLIST, threadID); + GetDevice()->BindResourcePS(textures[TEXTYPE_2D_LIGHTGRID_TRANSPARENT], TEXSLOT_LIGHTGRID, threadID); + } + + if (grass) + { + GetDevice()->BindDepthStencilState(depthStencils[DSSTYPE_HAIRALPHACOMPOSITION], STENCILREF_DEFAULT, threadID); // minimizes overdraw by depthcomp = less + GetDevice()->BindBlendState(blendStates[BSTYPE_TRANSPARENT], threadID); + for (wiHairParticle* hair : culling.culledHairParticleSystems) + { + hair->Draw(camera, shaderType, threadID); + } + } + if (!culledRenderer.empty()) { - GetDevice()->EventBegin(L"DrawWorld"); if (!wireRender) { @@ -3321,17 +3349,11 @@ void wiRenderer::DrawWorldTransparent(Camera* camera, SHADERTYPE shaderType, Tex GetDevice()->BindResourcePS(refracRes, TEXSLOT_ONDEMAND7, threadID); GetDevice()->BindResourcePS(waterRippleNormals, TEXSLOT_ONDEMAND8, threadID); } - - if (shaderType == SHADERTYPE_TILEDFORWARD) - { - GetDevice()->BindResourcePS(resourceBuffers[RBTYPE_LIGHTINDEXLIST_TRANSPARENT], SBSLOT_LIGHTINDEXLIST, threadID); - GetDevice()->BindResourcePS(textures[TEXTYPE_2D_LIGHTGRID_TRANSPARENT], TEXSLOT_LIGHTGRID, threadID); - } RenderMeshes(camera->translation, culledRenderer, shaderType, RENDERTYPE_TRANSPARENT | RENDERTYPE_WATER, threadID, false); - - GetDevice()->EventEnd(); } + + GetDevice()->EventEnd(); } @@ -3652,9 +3674,19 @@ void wiRenderer::UpdateCameraCB(Camera* camera, GRAPHICSTHREAD threadID) GetDevice()->UpdateBuffer(constantBuffers[CBTYPE_CAMERA], &cb, threadID); } +wiRenderer::APICB* apiCB = new wiRenderer::APICB(XMFLOAT4(0, 0, 0, 0), 0.75f); void wiRenderer::SetClipPlane(XMFLOAT4 clipPlane, GRAPHICSTHREAD threadID) { - GetDevice()->UpdateBuffer(constantBuffers[CBTYPE_CLIPPLANE], &clipPlane, threadID); + apiCB->clipPlane = clipPlane; + GetDevice()->UpdateBuffer(constantBuffers[CBTYPE_API], apiCB, threadID); +} +void wiRenderer::SetAlphaRef(float alphaRef, GRAPHICSTHREAD threadID) +{ + if (alphaRef != apiCB->alphaRef) + { + apiCB->alphaRef = alphaRef; + GetDevice()->UpdateBuffer(constantBuffers[CBTYPE_API], apiCB, threadID); + } } void wiRenderer::UpdateGBuffer(Texture2D* slot0, Texture2D* slot1, Texture2D* slot2, Texture2D* slot3, Texture2D* slot4, GRAPHICSTHREAD threadID) { diff --git a/WickedEngine/wiRenderer.h b/WickedEngine/wiRenderer.h index 8925376fe..1ec8a38f4 100644 --- a/WickedEngine/wiRenderer.h +++ b/WickedEngine/wiRenderer.h @@ -201,6 +201,10 @@ public: GFX_STRUCT APICB { XMFLOAT4 clipPlane; + float alphaRef; + float pad[3]; + + APICB(const XMFLOAT4& clipPlane, float alphaRef) :clipPlane(clipPlane), alphaRef(alphaRef) {} CB_SETBINDSLOT(CBSLOT_API) @@ -368,6 +372,8 @@ public: static void UpdateFrameCB(GRAPHICSTHREAD threadID); static void UpdateCameraCB(Camera* camera, GRAPHICSTHREAD threadID); static void SetClipPlane(XMFLOAT4 clipPlane, GRAPHICSTHREAD threadID); + static void SetAlphaRef(float alphaRef, GRAPHICSTHREAD threadID); + static void ResetAlphaRef(GRAPHICSTHREAD threadID) { SetAlphaRef(0.75f, threadID); } static void UpdateGBuffer(wiGraphicsTypes::Texture2D* slot0, wiGraphicsTypes::Texture2D* slot1, wiGraphicsTypes::Texture2D* slot2, wiGraphicsTypes::Texture2D* slot3, wiGraphicsTypes::Texture2D* slot4, GRAPHICSTHREAD threadID); static void UpdateDepthBuffer(wiGraphicsTypes::Texture2D* depth, wiGraphicsTypes::Texture2D* linearDepth, GRAPHICSTHREAD threadID); diff --git a/WickedEngine/wiVersion.cpp b/WickedEngine/wiVersion.cpp index ad213b7a5..2b11ff33f 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 = 19; + const int revision = 20; long GetVersion()