[libgdx] Use separate color/alpha blend functions to fix non-PMA FBO rendering.

closes #1540
This commit is contained in:
Nathan Sweet 2020-12-08 17:26:31 -08:00
parent 279fb3fca9
commit 08927258cc
2 changed files with 17 additions and 19 deletions

View File

@ -29,30 +29,28 @@
package com.esotericsoftware.spine; 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. */ /** Determines how images are blended with existing pixels when drawn. */
public enum BlendMode { public enum BlendMode {
normal(GL20.GL_SRC_ALPHA, GL20.GL_ONE, GL20.GL_ONE_MINUS_SRC_ALPHA), // normal(GL_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA, GL_ONE), //
additive(GL20.GL_SRC_ALPHA, GL20.GL_ONE, GL20.GL_ONE), // additive(GL_SRC_ALPHA, GL_ONE, GL_ONE, GL_ONE), //
multiply(GL20.GL_DST_COLOR, GL20.GL_DST_COLOR, GL20.GL_ONE_MINUS_SRC_ALPHA), // multiply(GL_DST_COLOR, GL_DST_COLOR, GL_ONE_MINUS_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA), //
screen(GL20.GL_ONE, GL20.GL_ONE, GL20.GL_ONE_MINUS_SRC_COLOR), // 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.source = source;
this.sourcePMA = sourcePremultipledAlpha; this.sourcePMA = sourcePMA;
this.dest = dest; this.destColor = destColor;
this.sourceAlpha = sourceAlpha;
} }
public int getSource (boolean premultipliedAlpha) { public void apply (Batch batch, boolean premultipliedAlpha) {
return premultipliedAlpha ? sourcePMA : source; batch.setBlendFunctionSeparate(premultipliedAlpha ? sourcePMA : source, destColor, sourceAlpha, destColor);
}
public int getDest () {
return dest;
} }
static public final BlendMode[] values = values(); static public final BlendMode[] values = values();

View File

@ -110,7 +110,7 @@ public class SkeletonRenderer {
alpha = 0; alpha = 0;
} }
blendMode = slotBlendMode; blendMode = slotBlendMode;
batch.setBlendFunction(blendMode.getSource(pmaBlendModes), blendMode.getDest()); blendMode.apply(batch, pmaBlendModes);
} }
float c = NumberUtils.intToFloatColor((int)alpha << 24 // float c = NumberUtils.intToFloatColor((int)alpha << 24 //
@ -222,7 +222,7 @@ public class SkeletonRenderer {
alpha = 0; alpha = 0;
} }
blendMode = slotBlendMode; blendMode = slotBlendMode;
batch.setBlendFunction(blendMode.getSource(pmaBlendModes), blendMode.getDest()); blendMode.apply(batch, pmaBlendModes);
} }
float c = NumberUtils.intToFloatColor((int)alpha << 24 // float c = NumberUtils.intToFloatColor((int)alpha << 24 //
@ -348,7 +348,7 @@ public class SkeletonRenderer {
alpha = 0; alpha = 0;
} }
blendMode = slotBlendMode; blendMode = slotBlendMode;
batch.setBlendFunction(blendMode.getSource(pmaBlendModes), blendMode.getDest()); blendMode.apply(batch, pmaBlendModes);
} }
float red = r * color.r * multiplier; float red = r * color.r * multiplier;