diff --git a/GPU/Software/Rasterizer.cpp b/GPU/Software/Rasterizer.cpp index dbdb5c706a..6459a8e1e4 100644 --- a/GPU/Software/Rasterizer.cpp +++ b/GPU/Software/Rasterizer.cpp @@ -226,9 +226,15 @@ void DrawTriangle(const VertexData& v0, const VertexData& v1, const VertexData& int prim_color_a = 0; Vec3 sec_color(0, 0, 0); if ((gstate.shademodel&1) == GE_SHADE_GOURAUD) { - prim_color_rgb = ((v0.color0.rgb() * w0 / v0.clippos.w + v1.color0.rgb() * w1 / v1.clippos.w + v2.color0.rgb() * w2 / v2.clippos.w) / den).Cast(); + // NOTE: When not casting color0 and color1 to float vectors, this code suffers from severe overflow issues. + // Not sure if that should be regarded as a bug or if casting to float is a valid fix. + prim_color_rgb = ((v0.color0.rgb().Cast() * w0 / v0.clippos.w + + v1.color0.rgb().Cast() * w1 / v1.clippos.w + + v2.color0.rgb().Cast() * w2 / v2.clippos.w) / den).Cast(); prim_color_a = (int)((v0.color0.a() * w0 / v0.clippos.w + v1.color0.a() * w1 / v1.clippos.w + v2.color0.a() * w2 / v2.clippos.w) / den); - sec_color = ((v0.color1 * w0 / v0.clippos.w + v1.color1 * w1 / v1.clippos.w + v2.color1 * w2 / v2.clippos.w) / den).Cast(); + sec_color = ((v0.color1.Cast() * w0 / v0.clippos.w + + v1.color1.Cast() * w1 / v1.clippos.w + + v2.color1.Cast() * w2 / v2.clippos.w) / den).Cast(); } else { prim_color_rgb = v2.color0.rgb(); prim_color_a = v2.color0.a();