diff options
| author | 2015-07-21 01:24:27 -0300 | |
|---|---|---|
| committer | 2015-07-23 16:51:24 -0300 | |
| commit | 4e092022267e4f232429013653ba1bd4ac8b0a05 (patch) | |
| tree | b24f12735d533f342e0a1e026fdb9c8fec7283c8 | |
| parent | Merge pull request #977 from yuriks/glenable-tex2d (diff) | |
| download | yuzu-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.
| -rw-r--r-- | src/video_core/vertex_shader.cpp | 6 |
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(), |