diff options
author | RĂ©mi Verschelde <remi@verschelde.fr> | 2021-01-20 00:10:21 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-01-20 00:10:21 +0100 |
commit | 8a6d4dd5ed770f4dc464bbc6af912b96c63bbc2c (patch) | |
tree | 357c7089c986be1f7d9a97e275424ffc326c6a8d /core/math | |
parent | f768d8651687cd80da85043c4446b9e0a50f39ef (diff) | |
parent | 099dee35f47db3e293cb8e60287ffe6a44f3d5d4 (diff) |
Merge pull request #45023 from reduz/optimize-shader-vgpr1
Shader optimizations to reduce VGPR usage and increase occupancy
Diffstat (limited to 'core/math')
-rw-r--r-- | core/math/camera_matrix.cpp | 9 | ||||
-rw-r--r-- | core/math/camera_matrix.h | 1 |
2 files changed, 10 insertions, 0 deletions
diff --git a/core/math/camera_matrix.cpp b/core/math/camera_matrix.cpp index 9ec71af57f..7dbda1d149 100644 --- a/core/math/camera_matrix.cpp +++ b/core/math/camera_matrix.cpp @@ -74,6 +74,15 @@ Plane CameraMatrix::xform4(const Plane &p_vec4) const { return ret; } +void CameraMatrix::adjust_perspective_znear(real_t p_new_znear) { + real_t zfar = get_z_far(); + real_t znear = p_new_znear; + + real_t deltaZ = zfar - znear; + matrix[2][2] = -(zfar + znear) / deltaZ; + matrix[3][2] = -2 * znear * zfar / deltaZ; +} + void CameraMatrix::set_perspective(real_t p_fovy_degrees, real_t p_aspect, real_t p_z_near, real_t p_z_far, bool p_flip_fov) { if (p_flip_fov) { p_fovy_degrees = get_fovy(p_fovy_degrees, 1.0 / p_aspect); diff --git a/core/math/camera_matrix.h b/core/math/camera_matrix.h index 03068bc7ea..3f327d3bc4 100644 --- a/core/math/camera_matrix.h +++ b/core/math/camera_matrix.h @@ -59,6 +59,7 @@ struct CameraMatrix { void set_orthogonal(real_t p_size, real_t p_aspect, real_t p_znear, real_t p_zfar, bool p_flip_fov = false); void set_frustum(real_t p_left, real_t p_right, real_t p_bottom, real_t p_top, real_t p_near, real_t p_far); void set_frustum(real_t p_size, real_t p_aspect, Vector2 p_offset, real_t p_near, real_t p_far, bool p_flip_fov = false); + void adjust_perspective_znear(real_t p_new_znear); static real_t get_fovy(real_t p_fovx, real_t p_aspect) { return Math::rad2deg(Math::atan(p_aspect * Math::tan(Math::deg2rad(p_fovx) * 0.5)) * 2.0); |