mirror of
https://github.com/EsotericSoftware/spine-runtimes.git
synced 2025-12-20 17:26:01 +08:00
[libgdx] Use separate color/alpha blend functions to fix non-PMA FBO rendering.
closes #1540
This commit is contained in:
parent
279fb3fca9
commit
08927258cc
@ -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();
|
||||
|
||||
@ -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;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user