summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Yuri Kunde Schlesner2015-07-21 01:24:27 -0300
committerGravatar Yuri Kunde Schlesner2015-07-23 16:51:24 -0300
commit4e092022267e4f232429013653ba1bd4ac8b0a05 (patch)
treeb24f12735d533f342e0a1e026fdb9c8fec7283c8 /src
parentMerge pull request #977 from yuriks/glenable-tex2d (diff)
downloadyuzu-4e092022267e4f232429013653ba1bd4ac8b0a05.tar.gz
yuzu-4e092022267e4f232429013653ba1bd4ac8b0a05.tar.xz
yuzu-4e092022267e4f232429013653ba1bd4ac8b0a05.zip
VideoCore: Saturate vertex colors before interpolating
During testing, it was discovered that hardware does not interpolate colors output by the vertex shader as-is. Rather, it drops the sign and saturates the value to 1.0. This is done before interpolation, such that (e.g.) interpolating outputs 1.5 and -0.5 is equivalent to as if the shader had output the values 1.0 and 0.5 instead, with the interpolated value never crossing 0.0. This change has been tested against hardware.
Diffstat (limited to '')
-rw-r--r--src/video_core/vertex_shader.cpp6
1 files changed, 6 insertions, 0 deletions
diff --git a/src/video_core/vertex_shader.cpp b/src/video_core/vertex_shader.cpp
index b77503806..ff114fc3a 100644
--- a/src/video_core/vertex_shader.cpp
+++ b/src/video_core/vertex_shader.cpp
@@ -610,6 +610,12 @@ OutputVertex RunShader(const InputVertex& input, int num_attributes, const Regs:
610 } 610 }
611 } 611 }
612 612
613 // The hardware takes the absolute and saturates vertex colors like this, *before* doing interpolation
614 for (int i = 0; i < 4; ++i) {
615 ret.color[i] = float24::FromFloat32(
616 std::fmin(std::fabs(ret.color[i].ToFloat32()), 1.0f));
617 }
618
613 LOG_TRACE(Render_Software, "Output vertex: pos (%.2f, %.2f, %.2f, %.2f), col(%.2f, %.2f, %.2f, %.2f), tc0(%.2f, %.2f)", 619 LOG_TRACE(Render_Software, "Output vertex: pos (%.2f, %.2f, %.2f, %.2f), col(%.2f, %.2f, %.2f, %.2f), tc0(%.2f, %.2f)",
614 ret.pos.x.ToFloat32(), ret.pos.y.ToFloat32(), ret.pos.z.ToFloat32(), ret.pos.w.ToFloat32(), 620 ret.pos.x.ToFloat32(), ret.pos.y.ToFloat32(), ret.pos.z.ToFloat32(), ret.pos.w.ToFloat32(),
615 ret.color.x.ToFloat32(), ret.color.y.ToFloat32(), ret.color.z.ToFloat32(), ret.color.w.ToFloat32(), 621 ret.color.x.ToFloat32(), ret.color.y.ToFloat32(), ret.color.z.ToFloat32(), ret.color.w.ToFloat32(),