summaryrefslogtreecommitdiffstats
path: root/src/video_core/rasterizer.cpp
diff options
context:
space:
mode:
authorJannik Vogel <email@jannikvogel.de>2016-03-20 01:53:49 +0100
committerJannik Vogel <email@jannikvogel.de>2016-05-10 08:58:52 +0200
commit4c98113b572551f34a907094ca059de8a724c9b1 (patch)
treefb9f11a97913786f7ff559a1e1045b864f0aa935 /src/video_core/rasterizer.cpp
parentMerge pull request #1704 from JayFoxRox/pod-config (diff)
downloadyuzu-4c98113b572551f34a907094ca059de8a724c9b1.tar
yuzu-4c98113b572551f34a907094ca059de8a724c9b1.tar.gz
yuzu-4c98113b572551f34a907094ca059de8a724c9b1.tar.bz2
yuzu-4c98113b572551f34a907094ca059de8a724c9b1.tar.lz
yuzu-4c98113b572551f34a907094ca059de8a724c9b1.tar.xz
yuzu-4c98113b572551f34a907094ca059de8a724c9b1.tar.zst
yuzu-4c98113b572551f34a907094ca059de8a724c9b1.zip
Diffstat (limited to 'src/video_core/rasterizer.cpp')
-rw-r--r--src/video_core/rasterizer.cpp26
1 files changed, 23 insertions, 3 deletions
diff --git a/src/video_core/rasterizer.cpp b/src/video_core/rasterizer.cpp
index df67b9081..80cad9056 100644
--- a/src/video_core/rasterizer.cpp
+++ b/src/video_core/rasterizer.cpp
@@ -862,10 +862,30 @@ static void ProcessTriangleInternal(const Shader::OutputVertex& v0,
}
}
+ // interpolated_z = z / w
+ float interpolated_z_over_w = (v0.screenpos[2].ToFloat32() * w0 +
+ v1.screenpos[2].ToFloat32() * w1 +
+ v2.screenpos[2].ToFloat32() * w2) / wsum;
+
+ // Not fully accurate. About 3 bits in precision are missing.
+ // Z-Buffer (z / w * scale + offset)
+ float depth_scale = float24::FromRaw(regs.viewport_depth_range).ToFloat32();
+ float depth_offset = float24::FromRaw(regs.viewport_depth_near_plane).ToFloat32();
+ float depth = interpolated_z_over_w * depth_scale + depth_offset;
+
+ // Potentially switch to W-Buffer
+ if (regs.depthmap_enable == Pica::Regs::DepthBuffering::WBuffering) {
+
+ // W-Buffer (z * scale + w * offset = (z / w * scale + offset) * w)
+ depth *= interpolated_w_inverse.ToFloat32() * wsum;
+ }
+
+ // Clamp the result
+ depth = MathUtil::Clamp(depth, 0.0f, 1.0f);
+
+ // Convert float to integer
unsigned num_bits = Regs::DepthBitsPerPixel(regs.framebuffer.depth_format);
- u32 z = (u32)((v0.screenpos[2].ToFloat32() * w0 +
- v1.screenpos[2].ToFloat32() * w1 +
- v2.screenpos[2].ToFloat32() * w2) * ((1 << num_bits) - 1) / wsum);
+ u32 z = (u32)(depth * ((1 << num_bits) - 1));
if (output_merger.depth_test_enable) {
u32 ref_z = GetDepth(x >> 4, y >> 4);