瀏覽代碼

[libgdx] Fixed non-PMA rendering in SkeletonRenderer. Colors were always premultiplied by alpha.

badlogic 8 年之前
父節點
當前提交
221372e409
共有 1 個文件被更改,包括 15 次插入12 次删除
  1. 15 12
      spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/SkeletonRenderer.java

+ 15 - 12
spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/SkeletonRenderer.java

@@ -78,10 +78,11 @@ public class SkeletonRenderer {
 				region.computeWorldVertices(slot.getBone(), vertices, 0, 5);
 				Color color = region.getColor(), slotColor = slot.getColor();
 				float alpha = a * slotColor.a * color.a * 255;
+				float multiplier = premultipliedAlpha ? alpha : 255;
 				float c = NumberUtils.intToFloatColor(((int)alpha << 24) //
-					| ((int)(b * slotColor.b * color.b * alpha) << 16) //
-					| ((int)(g * slotColor.g * color.g * alpha) << 8) //
-					| (int)(r * slotColor.r * color.r * alpha));
+					| ((int)(b * slotColor.b * color.b * multiplier) << 16) //
+					| ((int)(g * slotColor.g * color.g * multiplier) << 8) //
+					| (int)(r * slotColor.r * color.r * multiplier));
 				float[] uvs = region.getUVs();
 				for (int u = 0, v = 2; u < 8; u += 2, v += 5) {
 					vertices[v] = c;
@@ -173,10 +174,11 @@ public class SkeletonRenderer {
 			if (texture != null) {
 				Color slotColor = slot.getColor();
 				float alpha = a * slotColor.a * color.a * 255;
+				float multiplier = premultipliedAlpha ? alpha : 255;
 				float c = NumberUtils.intToFloatColor(((int)alpha << 24) //
-					| ((int)(b * slotColor.b * color.b * alpha) << 16) //
-					| ((int)(g * slotColor.g * color.g * alpha) << 8) //
-					| (int)(r * slotColor.r * color.r * alpha));
+					| ((int)(b * slotColor.b * color.b * multiplier) << 16) //
+					| ((int)(g * slotColor.g * color.g * multiplier) << 8) //
+					| (int)(r * slotColor.r * color.r * multiplier));
 
 				BlendMode slotBlendMode = slot.data.getBlendMode();
 				if (slotBlendMode != blendMode) {
@@ -284,16 +286,17 @@ public class SkeletonRenderer {
 			if (texture != null) {
 				Color lightColor = slot.getColor();
 				float alpha = a * lightColor.a * color.a * 255;
+				float multiplier = premultipliedAlpha ? alpha : 255;
 				float light = NumberUtils.intToFloatColor(((int)alpha << 24) //
-					| ((int)(b * lightColor.b * color.b * alpha) << 16) //
-					| ((int)(g * lightColor.g * color.g * alpha) << 8) //
-					| (int)(r * lightColor.r * color.r * alpha));
+					| ((int)(b * lightColor.b * color.b * multiplier) << 16) //
+					| ((int)(g * lightColor.g * color.g * multiplier) << 8) //
+					| (int)(r * lightColor.r * color.r * multiplier));
 				Color darkColor = slot.getDarkColor();
 				if (darkColor == null) darkColor = Color.BLACK;
 				float dark = NumberUtils.intToFloatColor( //
-					((int)(b * darkColor.b * color.b * 255) << 16) //
-						| ((int)(g * darkColor.g * color.g * 255) << 8) //
-						| (int)(r * darkColor.r * color.r * 255));
+					((int)(b * darkColor.b * color.b * multiplier) << 16) //
+						| ((int)(g * darkColor.g * color.g * multiplier) << 8) //
+						| (int)(r * darkColor.r * color.r * multiplier));
 
 				BlendMode slotBlendMode = slot.data.getBlendMode();
 				if (slotBlendMode != blendMode) {