From 56cfc0281633a2a5c797fbc178f66444fdeb1f15 Mon Sep 17 00:00:00 2001 From: redstrate <54911369+redstrate@users.noreply.github.com> Date: Wed, 19 Aug 2020 17:15:00 -0400 Subject: [PATCH] Fix look_at, and stop scene capture from creating cubemap seams --- engine/math/include/vector.hpp | 9 +++++++++ engine/math/src/transform.cpp | 11 ++++++----- engine/renderer/src/scenecapture.cpp | 24 +++++++----------------- engine/renderer/src/shadowpass.cpp | 14 +++++++------- shaders/filter.frag.glsl | 2 +- shaders/filter.vert.glsl | 2 +- shaders/irradiance.vert.glsl | 2 +- 7 files changed, 32 insertions(+), 32 deletions(-) diff --git a/engine/math/include/vector.hpp b/engine/math/include/vector.hpp index 2c4bcfb..77d2a5d 100755 --- a/engine/math/include/vector.hpp +++ b/engine/math/include/vector.hpp @@ -167,6 +167,15 @@ constexpr inline Vector operator*(const Vector lhs, const Vector +constexpr inline Vector operator+(const Vector lhs, const T scalar) { + Vector vec; + for(std::size_t i = 0; i < N; i++) + vec[i] = lhs[i] + scalar; + + return vec; +} + template constexpr inline Vector operator*(const Vector lhs, const T scalar) { Vector vec; diff --git a/engine/math/src/transform.cpp b/engine/math/src/transform.cpp index cceffe4..b02562c 100755 --- a/engine/math/src/transform.cpp +++ b/engine/math/src/transform.cpp @@ -52,7 +52,7 @@ Matrix4x4 transform::orthographic(float left, float right, float bottom, float t Matrix4x4 transform::look_at(const Vector3 eye, const Vector3 center, const Vector3 up) { const Vector3 f = normalize(center - eye); - const Vector3 s = normalize(cross(f, up)); + const Vector3 s = normalize(cross(up, f)); const Vector3 u = cross(f, s); Matrix4x4 result(1.0f); @@ -101,11 +101,12 @@ Matrix4x4 transform::rotate(const Matrix4x4 matrix, const float angle, const Vec Rotate[2][2] = c + temp[2] * axis[2]; Matrix4x4 result(1.0f); - result[0] = Rotate[0][0] + Rotate[0][1] + Rotate[0][2]; - result[1] = Rotate[1][0] + Rotate[1][1] + Rotate[1][2]; - result[2] = Rotate[2][0] + Rotate[2][1] + Rotate[2][2]; + result[0] = matrix[0] * Rotate[0][0] + matrix[1] * Rotate[0][1] + matrix[2] * Rotate[0][2]; + result[1] = matrix[0] * Rotate[1][0] + matrix[1] * Rotate[1][1] + matrix[2] * Rotate[1][2]; + result[2] = matrix[0] * Rotate[2][0] + matrix[1] * Rotate[2][1] + matrix[2] * Rotate[2][2]; + result[3] = matrix[3]; - return matrix * result; + return result; } Matrix4x4 transform::scale(const Matrix4x4 matrix, const Vector3 scale) { diff --git a/engine/renderer/src/scenecapture.cpp b/engine/renderer/src/scenecapture.cpp index d3d95e6..bbde600 100755 --- a/engine/renderer/src/scenecapture.cpp +++ b/engine/renderer/src/scenecapture.cpp @@ -45,22 +45,12 @@ struct SceneInformation { const int mipLevels = 5; const std::array sceneTransforms = { - transform::look_at(Vector3(0), Vector3(1.0, 0.0, 0.0), Vector3(0.0, -1.0, 0.0)), - transform::look_at(Vector3(0), Vector3(-1.0, 0.0, 0.0), Vector3(0.0, -1.0, 0.0)), - transform::look_at(Vector3(0), Vector3( 0.0, -1.0, 0.0), Vector3(0.0, 0.0,-1.0)), - transform::look_at(Vector3(0), Vector3( 0.0, 1.0, 0.0), Vector3(0.0, 0.0,1.0)), - transform::look_at(Vector3(0), Vector3( 0.0, 0.0, 1.0), Vector3(0.0, -1.0, 0.0)), - transform::look_at(Vector3(0), Vector3( 0.0, 0.0, -1.0), Vector3(0.0, -1.0, 0.0)) -}; - -// for some reason, our sky shader does not like the up/down transforms, so we reverse them here... -const std::array skyTransforms = { - transform::look_at(Vector3(0), Vector3(1.0, 0.0, 0.0), Vector3(0.0, -1.0, 0.0)), - transform::look_at(Vector3(0), Vector3(-1.0, 0.0, 0.0), Vector3(0.0, -1.0, 0.0)), - transform::look_at(Vector3(0), Vector3( 0.0, 1.0, 0.0), Vector3(0.0, 0.0, 1.0)), - transform::look_at(Vector3(0), Vector3( 0.0, -1.0, 0.0), Vector3(0.0, 0.0, -1.0)), - transform::look_at(Vector3(0), Vector3( 0.0, 0.0, 1.0), Vector3(0.0, -1.0, 0.0)), - transform::look_at(Vector3(0), Vector3( 0.0, 0.0, -1.0), Vector3(0.0, -1.0, 0.0)) + transform::look_at(Vector3(0), Vector3(-1.0, 0.0, 0.0), Vector3(0.0, -1.0, 0.0)), // right + transform::look_at(Vector3(0), Vector3(1.0, 0.0, 0.0), Vector3(0.0, -1.0, 0.0)), // left + transform::look_at(Vector3(0), Vector3( 0.0, -1.0, 0.0), Vector3(0.0, 0.0, -1.0)), // top + transform::look_at(Vector3(0), Vector3( 0.0, 1.0, 0.0), Vector3(0.0, 0.0, 1.0)), // bottom + transform::look_at(Vector3(0), Vector3( 0.0, 0.0, 1.0), Vector3(0.0, -1.0, 0.0)), // back + transform::look_at(Vector3(0), Vector3( 0.0, 0.0, -1.0), Vector3(0.0, -1.0, 0.0)) // front }; inline AssetPtr cubeMesh; @@ -293,7 +283,7 @@ void SceneCapture::render(GFXCommandBuffer* command_buffer, Scene* scene) { float aspect; } pc; - pc.view = skyTransforms[face]; + pc.view = sceneTransforms[face]; pc.aspect = 1.0f; for(auto& [obj, light] : scene->get_all()) { diff --git a/engine/renderer/src/shadowpass.cpp b/engine/renderer/src/shadowpass.cpp index 1c7d068..ec6a26c 100755 --- a/engine/renderer/src/shadowpass.cpp +++ b/engine/renderer/src/shadowpass.cpp @@ -15,12 +15,12 @@ struct PushConstant { }; const std::array shadowTransforms = { - transform::look_at(Vector3(0), Vector3(1.0, 0.0, 0.0), Vector3(0.0, -1.0, 0.0)), - transform::look_at(Vector3(0), Vector3(-1.0, 0.0, 0.0), Vector3(0.0, -1.0, 0.0)), - transform::look_at(Vector3(0), Vector3( 0.0, 1.0, 0.0), Vector3(0.0, 0.0,1.0)), - transform::look_at(Vector3(0), Vector3( 0.0, -1.0, 0.0), Vector3(0.0, 0.0,-1.0)), - transform::look_at(Vector3(0), Vector3( 0.0, 0.0, 1.0), Vector3(0.0, -1.0, 0.0)), - transform::look_at(Vector3(0), Vector3( 0.0, 0.0, -1.0), Vector3(0.0, -1.0, 0.0)) + transform::look_at(Vector3(0), Vector3(1.0, 0.0, 0.0), Vector3(0.0, 1.0, 0.0)), // right + transform::look_at(Vector3(0), Vector3(-1.0, 0.0, 0.0), Vector3(0.0, 1.0, 0.0)), // left + transform::look_at(Vector3(0), Vector3( 0.0, 1.0, 0.0), Vector3(0.0, 0.0, -1.0)), // top + transform::look_at(Vector3(0), Vector3( 0.0, -1.0, 0.0), Vector3(0.0, 0.0, 1.0)), // bottom + transform::look_at(Vector3(0), Vector3( 0.0, 0.0, 1.0), Vector3(0.0, 1.0, 0.0)), // back + transform::look_at(Vector3(0), Vector3( 0.0, 0.0, -1.0), Vector3(0.0, 1.0, 0.0)) // front }; ShadowPass::ShadowPass(GFX* gfx) { @@ -231,7 +231,7 @@ void ShadowPass::render_spot(GFXCommandBuffer* command_buffer, Scene& scene, Obj const Matrix4x4 realMVP = perspective * inverse(scene.get(light_object).model); scene.spotLightSpaces[last_spot_light] = perspective; - scene.spotLightSpaces[last_spot_light][1][1] *= -1; + scene.spotLightSpaces[1][1] *= -1; scene.spotLightSpaces[last_spot_light] = scene.spotLightSpaces[last_spot_light] * inverse(scene.get(light_object).model); const auto frustum = normalize_frustum(extract_frustum(perspective * inverse(scene.get(light_object).model))); diff --git a/shaders/filter.frag.glsl b/shaders/filter.frag.glsl index b0cf7d8..37241a3 100755 --- a/shaders/filter.frag.glsl +++ b/shaders/filter.frag.glsl @@ -13,7 +13,7 @@ layout(push_constant, binding = 1) uniform readonly PushConstant{ }; void main() { - const vec3 N = normalize(inPos); + vec3 N = normalize(inPos); // make the simplyfying assumption that V equals R equals the normal const vec3 R = N; diff --git a/shaders/filter.vert.glsl b/shaders/filter.vert.glsl index c70a1cc..d213b6d 100755 --- a/shaders/filter.vert.glsl +++ b/shaders/filter.vert.glsl @@ -9,5 +9,5 @@ layout(push_constant, binding = 1) uniform readonly PushConstant{ void main() { gl_Position = mvp * vec4(inPosition, 1.0); - outPos = inPosition, 1.0; + outPos = inPosition; } diff --git a/shaders/irradiance.vert.glsl b/shaders/irradiance.vert.glsl index 22774ca..c1947fa 100755 --- a/shaders/irradiance.vert.glsl +++ b/shaders/irradiance.vert.glsl @@ -8,5 +8,5 @@ layout(push_constant, binding = 1) uniform readonly PushConstant{ void main() { gl_Position = mvp * vec4(inPosition, 1.0); - outPos = inPosition, 1.0; + outPos = inPosition; }