From 3aef00f466359e0f7ecc03a5aa71ebc5a318d1b9 Mon Sep 17 00:00:00 2001 From: myT <> Date: Wed, 12 Feb 2025 03:25:43 +0100 Subject: [PATCH] fixed the blend equations to match the GL/D3D specs --- code/renderer/shaders/common/blend.hlsli | 42 +++++++++---------- code/renderer/shaders/crp/transp_resolve.hlsl | 2 +- 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/code/renderer/shaders/common/blend.hlsli b/code/renderer/shaders/common/blend.hlsli index 298d4f5..df2366d 100644 --- a/code/renderer/shaders/common/blend.hlsli +++ b/code/renderer/shaders/common/blend.hlsli @@ -26,56 +26,56 @@ along with Challenge Quake 3. If not, see . #endif -float4 BlendSource(float4 src, float4 dst, uint stateBits) +float4 BlendFactorSource(float4 src, float4 dst, uint stateBits) { if(stateBits == GLS_SRCBLEND_ZERO) return float4(0.0, 0.0, 0.0, 0.0); else if(stateBits == GLS_SRCBLEND_ONE) - return src; + return float4(1.0, 1.0, 1.0, 1.0); else if(stateBits == GLS_SRCBLEND_DST_COLOR) - return src * dst; + return dst; else if(stateBits == GLS_SRCBLEND_ONE_MINUS_DST_COLOR) - return src * (float4(1.0, 1.0, 1.0, 1.0) - dst); + return float4(1.0, 1.0, 1.0, 1.0) - dst; else if(stateBits == GLS_SRCBLEND_SRC_ALPHA) - return src * float4(src.a, src.a, src.a, 1.0); + return src.aaaa; else if(stateBits == GLS_SRCBLEND_ONE_MINUS_SRC_ALPHA) - return src * float4(1.0 - src.a, 1.0 - src.a, 1.0 - src.a, 1.0); + return (1.0 - src.a).xxxx; else if(stateBits == GLS_SRCBLEND_DST_ALPHA) - return src * float4(dst.a, dst.a, dst.a, 1.0); + return dst.aaaa; else if(stateBits == GLS_SRCBLEND_ONE_MINUS_DST_ALPHA) - return src * float4(1.0 - dst.a, 1.0 - dst.a, 1.0 - dst.a, 1.0); + return (1.0 - dst.a).xxxx; else if(stateBits == GLS_SRCBLEND_ALPHA_SATURATE) - return src * float4(src.a, src.a, src.a, 1.0); + return float4(min(src.a, 1.0 - dst.a).xxx, 1.0); else - return src; + return float4(1.0, 1.0, 1.0, 1.0); // 0 => replace mode } -float4 BlendDest(float4 src, float4 dst, uint stateBits) +float4 BlendFactorDest(float4 src, float4 dst, uint stateBits) { if(stateBits == GLS_DSTBLEND_ZERO) return float4(0.0, 0.0, 0.0, 0.0); else if(stateBits == GLS_DSTBLEND_ONE) - return dst; + return float4(1.0, 1.0, 1.0, 1.0); else if(stateBits == GLS_DSTBLEND_SRC_COLOR) - return dst * src; + return src; else if(stateBits == GLS_DSTBLEND_ONE_MINUS_SRC_COLOR) - return dst * float4(1.0 - src.r, 1.0 - src.g, 1.0 - src.b, 1.0 - src.a); + return float4(1.0, 1.0, 1.0, 1.0) - src; else if(stateBits == GLS_DSTBLEND_SRC_ALPHA) - return dst * float4(src.a, src.a, src.a, 1.0); + return src.aaaa; else if(stateBits == GLS_DSTBLEND_ONE_MINUS_SRC_ALPHA) - return dst * float4(1.0 - src.a, 1.0 - src.a, 1.0 - src.a, 0.0); + return (1.0 - src.a).xxxx; else if(stateBits == GLS_DSTBLEND_DST_ALPHA) - return dst * float4(dst.a, dst.a, dst.a, 1.0); + return dst.aaaa; else if(stateBits == GLS_DSTBLEND_ONE_MINUS_DST_ALPHA) - return dst * float4(1.0 - dst.a, 1.0 - dst.a, 1.0 - dst.a, 1.0); + return (1.0 - dst.a).xxxx; else - return float4(0.0, 0.0, 0.0, 0.0); + return float4(0.0, 0.0, 0.0, 0.0); // 0 => replace mode } float4 Blend(float4 src, float4 dst, uint stateBits) { - float4 srcOut = BlendSource(src, dst, stateBits & GLS_SRCBLEND_BITS); - float4 dstOut = BlendDest(src, dst, stateBits & GLS_DSTBLEND_BITS); + float4 srcOut = src * BlendFactorSource(src, dst, stateBits & GLS_SRCBLEND_BITS); + float4 dstOut = dst * BlendFactorDest(src, dst, stateBits & GLS_DSTBLEND_BITS); return srcOut + dstOut; } diff --git a/code/renderer/shaders/crp/transp_resolve.hlsl b/code/renderer/shaders/crp/transp_resolve.hlsl index 3fc1aca..f316704 100644 --- a/code/renderer/shaders/crp/transp_resolve.hlsl +++ b/code/renderer/shaders/crp/transp_resolve.hlsl @@ -162,7 +162,7 @@ float3 BlendInScatteredLight(float4 srcColor, float3 dstColor, uint blendBits) } uint dstBlend = blendBits & GLS_DSTBLEND_BITS; - float3 dstContrib = BlendDest(srcColor, float4(dstColor, 1), dstBlend).rgb; + float3 dstContrib = dstColor * BlendFactorDest(srcColor, float4(dstColor, 1), dstBlend).rgb; float3 result = srcContrib + dstContrib; return result;