From 08927258cc2a3e533b4ab3d99f769d864252aa06 Mon Sep 17 00:00:00 2001 From: Nathan Sweet Date: Tue, 8 Dec 2020 17:26:31 -0800 Subject: [PATCH 1/2] [libgdx] Use separate color/alpha blend functions to fix non-PMA FBO rendering. closes #1540 --- .../com/esotericsoftware/spine/BlendMode.java | 30 +++++++++---------- .../spine/SkeletonRenderer.java | 6 ++-- 2 files changed, 17 insertions(+), 19 deletions(-) diff --git a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/BlendMode.java b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/BlendMode.java index 2ac8580b5..b600776cd 100644 --- a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/BlendMode.java +++ b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/BlendMode.java @@ -29,30 +29,28 @@ package com.esotericsoftware.spine; -import com.badlogic.gdx.graphics.GL20; +import static com.badlogic.gdx.graphics.GL20.*; + +import com.badlogic.gdx.graphics.g2d.Batch; /** Determines how images are blended with existing pixels when drawn. */ public enum BlendMode { - normal(GL20.GL_SRC_ALPHA, GL20.GL_ONE, GL20.GL_ONE_MINUS_SRC_ALPHA), // - additive(GL20.GL_SRC_ALPHA, GL20.GL_ONE, GL20.GL_ONE), // - multiply(GL20.GL_DST_COLOR, GL20.GL_DST_COLOR, GL20.GL_ONE_MINUS_SRC_ALPHA), // - screen(GL20.GL_ONE, GL20.GL_ONE, GL20.GL_ONE_MINUS_SRC_COLOR), // - ; + normal(GL_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA, GL_ONE), // + additive(GL_SRC_ALPHA, GL_ONE, GL_ONE, GL_ONE), // + multiply(GL_DST_COLOR, GL_DST_COLOR, GL_ONE_MINUS_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA), // + screen(GL_ONE, GL_ONE, GL_ONE_MINUS_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR); - int source, sourcePMA, dest; + public final int source, sourcePMA, destColor, sourceAlpha; - BlendMode (int source, int sourcePremultipledAlpha, int dest) { + BlendMode (int source, int sourcePMA, int destColor, int sourceAlpha) { this.source = source; - this.sourcePMA = sourcePremultipledAlpha; - this.dest = dest; + this.sourcePMA = sourcePMA; + this.destColor = destColor; + this.sourceAlpha = sourceAlpha; } - public int getSource (boolean premultipliedAlpha) { - return premultipliedAlpha ? sourcePMA : source; - } - - public int getDest () { - return dest; + public void apply (Batch batch, boolean premultipliedAlpha) { + batch.setBlendFunctionSeparate(premultipliedAlpha ? sourcePMA : source, destColor, sourceAlpha, destColor); } static public final BlendMode[] values = values(); diff --git a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/SkeletonRenderer.java b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/SkeletonRenderer.java index 80f8fb5f9..6c6ae2c5b 100644 --- a/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/SkeletonRenderer.java +++ b/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/SkeletonRenderer.java @@ -110,7 +110,7 @@ public class SkeletonRenderer { alpha = 0; } blendMode = slotBlendMode; - batch.setBlendFunction(blendMode.getSource(pmaBlendModes), blendMode.getDest()); + blendMode.apply(batch, pmaBlendModes); } float c = NumberUtils.intToFloatColor((int)alpha << 24 // @@ -222,7 +222,7 @@ public class SkeletonRenderer { alpha = 0; } blendMode = slotBlendMode; - batch.setBlendFunction(blendMode.getSource(pmaBlendModes), blendMode.getDest()); + blendMode.apply(batch, pmaBlendModes); } float c = NumberUtils.intToFloatColor((int)alpha << 24 // @@ -348,7 +348,7 @@ public class SkeletonRenderer { alpha = 0; } blendMode = slotBlendMode; - batch.setBlendFunction(blendMode.getSource(pmaBlendModes), blendMode.getDest()); + blendMode.apply(batch, pmaBlendModes); } float red = r * color.r * multiplier; From 3d3f019817b4049a86071dd6ea01f4256187157a Mon Sep 17 00:00:00 2001 From: Harald Csaszar Date: Wed, 9 Dec 2020 19:15:19 +0100 Subject: [PATCH 2/2] [unity] Changed default Sprite shader ramp mode from `Old Hard` to `Hard` for 4.0 and newer. This will affect newly created materials only. See commit 2fde05e. --- CHANGELOG.md | 2 +- .../Editor/spine-unity/Editor/Shaders/SpineSpriteShaderGUI.cs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f10e9c19c..5d8f6cb10 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -378,7 +378,7 @@ * `GetRemappedClone()` now provides an additional parameter `pivotShiftsMeshUVCoords` for `MeshAttachment` to prevent uv shifts at a non-central Sprite pivot. This parameter defaults to `true` to maintain previous behaviour. * `SkeletonRenderer` components now provide an additional update mode `Only Event Timelines` at the `Update When Invisible` property. This mode saves additional timeline updates compared to update mode `Everything Except Mesh`. * Now all URP (Universal Render Pipeline) and LWRP (Lightweight Render Pipeline) shaders support SRP (Scriptable Render Pipeline) batching. See [Unity SRPBatcher documentation pages](https://docs.unity3d.com/Manual/SRPBatcher.html) for additional information. - * Sprite shaders now provide four `Diffuse Ramp` modes as an Inspector Material parameter: `Hard`, `Soft`, `Old Hard` and `Old Soft`. In spine-unity 3.8 it defaults to `Old Hard` to keep the behaviour of existing projects unchanged. Note that `Old Hard` and `Old Soft` ramp versions were using only the right half of the ramp texture, and additionally multiplying the light intensity by 2, both leading to brighter lighting than without a ramp texture active. The new ramp modes `Hard` and `Soft` use the full ramp texture and do not modify light intensity, being consistent with lighting without a ramp texture active. + * Sprite shaders now provide four `Diffuse Ramp` modes as an Inspector Material parameter: `Hard`, `Soft`, `Old Hard` and `Old Soft`. In spine-unity 3.8 it defaults to `Old Hard` to keep the behaviour of existing projects unchanged. From 4.0 on it defaults to `Hard` for newly created materials while existing ones remain unchanged. Note that `Old Hard` and `Old Soft` ramp versions were using only the right half of the ramp texture, and additionally multiplying the light intensity by 2, both leading to brighter lighting than without a ramp texture active. The new ramp modes `Hard` and `Soft` use the full ramp texture and do not modify light intensity, being consistent with lighting without a ramp texture active. * **Changes of default values** * `SkeletonMecanim`'s `Layer Mix Mode` now defaults to `MixMode.MixNext` instead of `MixMode.MixAlways`. diff --git a/spine-unity/Assets/Spine/Editor/spine-unity/Editor/Shaders/SpineSpriteShaderGUI.cs b/spine-unity/Assets/Spine/Editor/spine-unity/Editor/Shaders/SpineSpriteShaderGUI.cs index d28da4582..cb0fbdc6e 100644 --- a/spine-unity/Assets/Spine/Editor/spine-unity/Editor/Shaders/SpineSpriteShaderGUI.cs +++ b/spine-unity/Assets/Spine/Editor/spine-unity/Editor/Shaders/SpineSpriteShaderGUI.cs @@ -88,7 +88,7 @@ public class SpineSpriteShaderGUI : SpineShaderWithOutlineGUI { OldHard = 2, OldSoft = 3, - DefaultRampMode = OldHard + DefaultRampMode = FullRangeHard }; MaterialProperty _mainTexture = null; @@ -643,7 +643,7 @@ public class SpineSpriteShaderGUI : SpineShaderWithOutlineGUI { if (EditorGUI.EndChangeCheck()) { if (rampMode == eDiffuseRampMode.NoRampSpecified) - rampMode = eDiffuseRampMode.DefaultRampMode; + rampMode = eDiffuseRampMode.OldHard; SetDiffuseRampMode(_materialEditor, rampMode); mixedRampMode = false;