From 0dc0ede9ea3c58a09a79a63f1be90f8bf042511d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tur=C3=A1nszki=20J=C3=A1nos?= Date: Mon, 27 Jan 2025 08:47:44 +0100 Subject: [PATCH] alpha testing improvements --- WickedEngine/shaders/objectHF.hlsli | 31 ++++++++++++++--------------- WickedEngine/wiRenderer.cpp | 3 ++- WickedEngine/wiScene_Components.h | 1 + WickedEngine/wiVersion.cpp | 2 +- 4 files changed, 19 insertions(+), 18 deletions(-) diff --git a/WickedEngine/shaders/objectHF.hlsli b/WickedEngine/shaders/objectHF.hlsli index b7d910cd2..3e62fca71 100644 --- a/WickedEngine/shaders/objectHF.hlsli +++ b/WickedEngine/shaders/objectHF.hlsli @@ -7,9 +7,9 @@ #define SHADOW_MASK_ENABLED #endif // TRANSPARENT -#if !defined(TRANSPARENT) && !defined(PREPASS) +#if !defined(TRANSPARENT) && !defined(PREPASS) && !defined(ENVMAPRENDERING) #define DISABLE_ALPHATEST -#endif // !defined(TRANSPARENT) && !defined(PREPASS) +#endif // !defined(TRANSPARENT) && !defined(PREPASS) && !defined(ENVMAPRENDERING) #ifdef PLANARREFLECTION #define DISABLE_ENVMAPS @@ -475,6 +475,12 @@ PixelInput main(VertexInput input) #pragma PSSL_target_output_format (target 0 FMT_32_R) #endif // __PSSL__ && PREPASS +#ifdef DISABLE_ALPHATEST +#define APPEND_COVERAGE_OUTPUT +#else +#define APPEND_COVERAGE_OUTPUT , out uint coverage : SV_Coverage +#endif // DISABLE_ALPHATEST + #ifdef EARLY_DEPTH_STENCIL [earlydepthstencil] #endif // EARLY_DEPTH_STENCIL @@ -482,12 +488,12 @@ PixelInput main(VertexInput input) // entry point: #ifdef PREPASS #ifdef DEPTHONLY -void main(PixelInput input, in uint primitiveID : SV_PrimitiveID, out uint coverage : SV_Coverage) +void main(PixelInput input, in uint primitiveID : SV_PrimitiveID APPEND_COVERAGE_OUTPUT) #else -uint main(PixelInput input, in uint primitiveID : SV_PrimitiveID, out uint coverage : SV_Coverage) : SV_Target +uint main(PixelInput input, in uint primitiveID : SV_PrimitiveID APPEND_COVERAGE_OUTPUT) : SV_Target #endif // DEPTHONLY #else -float4 main(PixelInput input, in bool is_frontface : SV_IsFrontFace) : SV_Target +float4 main(PixelInput input, in bool is_frontface : SV_IsFrontFace APPEND_COVERAGE_OUTPUT) : SV_Target #endif // PREPASS @@ -607,16 +613,6 @@ float4 main(PixelInput input, in bool is_frontface : SV_IsFrontFace) : SV_Target #endif // OBJECTSHADER_USE_COLOR -#ifndef DISABLE_ALPHATEST -#ifdef TRANSPARENT - // Alpha test only for transparents - // - Prepass will write alpha coverage mask - // - Opaque will use [earlydepthstencil] and COMPARISON_EQUAL depth test on top of depth prepass - clip(surface.baseColor.a - material.GetAlphaTest() - meshinstance.GetAlphaTest()); -#endif // TRANSPARENT -#endif // DISABLE_ALPHATEST - - #ifndef WATER #ifdef OBJECTSHADER_USE_TANGENT [branch] @@ -1086,9 +1082,12 @@ float4 main(PixelInput input, in bool is_frontface : SV_IsFrontFace) : SV_Target color = saturateMediump(color); +#ifndef DISABLE_ALPHATEST + coverage = AlphaToCoverage(color.a, material.GetAlphaTest() + meshinstance.GetAlphaTest(), input.pos); // opaque soft alpha test (MSAA, temporal AA support) +#endif // DISABLE_ALPHATEST + // end point: #ifdef PREPASS - coverage = AlphaToCoverage(color.a, material.GetAlphaTest() + meshinstance.GetAlphaTest(), input.pos); // opaque soft alpha test (temporal AA, etc) #ifndef DEPTHONLY PrimitiveID prim; prim.primitiveIndex = primitiveID; diff --git a/WickedEngine/wiRenderer.cpp b/WickedEngine/wiRenderer.cpp index 379b1b566..15373322a 100644 --- a/WickedEngine/wiRenderer.cpp +++ b/WickedEngine/wiRenderer.cpp @@ -8310,6 +8310,7 @@ void RefreshEnvProbes(const Visibility& vis, CommandList cmd) cb.cameras[i].internal_resolution = uint2(probe.texture.desc.width, probe.texture.desc.height); cb.cameras[i].internal_resolution_rcp.x = 1.0f / cb.cameras[i].internal_resolution.x; cb.cameras[i].internal_resolution_rcp.y = 1.0f / cb.cameras[i].internal_resolution.y; + cb.cameras[i].sample_count = probe.GetSampleCount(); XMStoreFloat4(&cb.cameras[i].frustum_corners.cornersNEAR[0], XMVector3TransformCoord(XMVectorSet(-1, 1, 1, 1), invVP)); XMStoreFloat4(&cb.cameras[i].frustum_corners.cornersNEAR[1], XMVector3TransformCoord(XMVectorSet(1, 1, 1, 1), invVP)); @@ -8349,7 +8350,7 @@ void RefreshEnvProbes(const Visibility& vis, CommandList cmd) static wi::unordered_map render_textures; static std::mutex locker; { - const uint32_t required_sample_count = probe.IsMSAA() ? EnvironmentProbeComponent::envmapMSAASampleCount : 1; + const uint32_t required_sample_count = probe.GetSampleCount(); std::scoped_lock lck(locker); RenderTextureID id_depth = {}; diff --git a/WickedEngine/wiScene_Components.h b/WickedEngine/wiScene_Components.h index bc3c9bfd0..683b1f143 100644 --- a/WickedEngine/wiScene_Components.h +++ b/WickedEngine/wiScene_Components.h @@ -1307,6 +1307,7 @@ namespace wi::scene inline bool IsDirty() const { return _flags & DIRTY; } inline bool IsRealTime() const { return _flags & REALTIME; } inline bool IsMSAA() const { return _flags & MSAA; } + inline uint32_t GetSampleCount() const { return IsMSAA() ? envmapMSAASampleCount : 1; } size_t GetMemorySizeInBytes() const; diff --git a/WickedEngine/wiVersion.cpp b/WickedEngine/wiVersion.cpp index 41ac5b2e8..9f89262dc 100644 --- a/WickedEngine/wiVersion.cpp +++ b/WickedEngine/wiVersion.cpp @@ -9,7 +9,7 @@ namespace wi::version // minor features, major updates, breaking compatibility changes const int minor = 71; // minor bug fixes, alterations, refactors, updates - const int revision = 665; + const int revision = 666; const std::string version_string = std::to_string(major) + "." + std::to_string(minor) + "." + std::to_string(revision);