diff --git a/Renderer/Renderer.cpp b/Renderer/Renderer.cpp index d1790e9..bc8a47a 100644 --- a/Renderer/Renderer.cpp +++ b/Renderer/Renderer.cpp @@ -346,6 +346,7 @@ void Renderer::draw() { .proj = p, .time = time, .cam_pos = cam.pos, + .cam_dir = cam.dir(), .viewport = glm::vec2(viewport.width, viewport.y), .tess_factor = tess_factor, .tess_edge_size = tess_edge_size, diff --git a/Renderer/UniformBuffer.hpp b/Renderer/UniformBuffer.hpp index 851df66..c20ef40 100644 --- a/Renderer/UniformBuffer.hpp +++ b/Renderer/UniformBuffer.hpp @@ -9,6 +9,22 @@ #include +/* Uniform: + * + * layout (set = 0, binding = 0) uniform Matrices { + * mat4 view; + * mat4 proj; + * float time; + * vec3 cam_pos; + * vec3 cam_dir; + * vec4 frustum[6]; + * vec2 viewport; + * float tess_factor; + * float tess_edge_size; + * }; + * + */ + struct UniformData { glm::mat4 view; glm::mat4 proj; @@ -18,6 +34,8 @@ struct UniformData { float pad2; glm::vec3 cam_pos; float pad3; + glm::vec3 cam_dir; + float pad4; glm::vec4 frustum[6]; glm::vec2 viewport; float tess_factor; diff --git a/Scene/Camera.hpp b/Scene/Camera.hpp index bb8a310..15b2f54 100644 --- a/Scene/Camera.hpp +++ b/Scene/Camera.hpp @@ -14,7 +14,12 @@ struct Camera { glm::vec3 pos = glm::vec3(0.0f); - inline glm::mat4 view() { - return glm::lookAt(pos, pos+glm::vec3(sin(theta) * cos(phi), cos(theta), sin(theta) * sin(phi)), glm::vec3(0.0, 1.0, 0.0)); + inline glm::vec3 dir() { + return glm::vec3(sin(theta) * cos(phi), cos(theta), sin(theta) * sin(phi)); } + + inline glm::mat4 view() { + return glm::lookAt(pos, pos+dir(), glm::vec3(0.0, 1.0, 0.0)); + } + }; \ No newline at end of file diff --git a/assets/shaders/gooch.frag b/assets/shaders/gooch.frag index a60982a..51bd1f1 100644 --- a/assets/shaders/gooch.frag +++ b/assets/shaders/gooch.frag @@ -10,6 +10,7 @@ layout (set = 0, binding = 0) uniform Matrices { mat4 proj; float time; vec3 cam_pos; + vec3 cam_dir; vec4 frustum[6]; vec2 viewport; float tess_factor; diff --git a/assets/shaders/gooch.frag.spv b/assets/shaders/gooch.frag.spv index 92ef58f..5d08070 100644 Binary files a/assets/shaders/gooch.frag.spv and b/assets/shaders/gooch.frag.spv differ diff --git a/assets/shaders/lambert.frag b/assets/shaders/lambert.frag index 2ed7c73..65d306f 100644 --- a/assets/shaders/lambert.frag +++ b/assets/shaders/lambert.frag @@ -6,9 +6,15 @@ layout (location = 2) in vec3 pos; layout (location = 0) out vec4 FragColor; layout (set = 0, binding = 0) uniform Matrices { - mat4 mvp; + mat4 view; + mat4 proj; float time; vec3 cam_pos; + vec3 cam_dir; + vec4 frustum[6]; + vec2 viewport; + float tess_factor; + float tess_edge_size; }; layout (set = 0, binding = 1) uniform sampler2D tex; diff --git a/assets/shaders/lambert.frag.spv b/assets/shaders/lambert.frag.spv index fde53ba..db02c02 100644 Binary files a/assets/shaders/lambert.frag.spv and b/assets/shaders/lambert.frag.spv differ diff --git a/assets/shaders/terrain.frag b/assets/shaders/terrain.frag index 5998114..105a75d 100644 --- a/assets/shaders/terrain.frag +++ b/assets/shaders/terrain.frag @@ -10,6 +10,7 @@ layout (set = 0, binding = 0) uniform Matrices { mat4 proj; float time; vec3 cam_pos; + vec3 cam_dir; vec4 frustum[6]; vec2 viewport; float tess_factor; @@ -19,8 +20,8 @@ layout (set = 0, binding = 0) uniform Matrices { layout (set = 0, binding = 1) uniform sampler2D heightmap; void main() { - //vec3 light_pos = vec3(10.0*cos(time), 10.0, 0.0); - vec3 L = normalize(cam_pos-pos); + /* extract L (light direction) from view matrix */ + vec3 L = -cam_dir; float r = length(cam_pos-pos); float t = clamp(dot(L, norm), 0.0, 1.0) * 20.0/(r*r); diff --git a/assets/shaders/terrain.frag.spv b/assets/shaders/terrain.frag.spv index e8baa62..86a0808 100644 Binary files a/assets/shaders/terrain.frag.spv and b/assets/shaders/terrain.frag.spv differ diff --git a/assets/shaders/terrain.tesc b/assets/shaders/terrain.tesc index fc7a229..0d63ac0 100644 --- a/assets/shaders/terrain.tesc +++ b/assets/shaders/terrain.tesc @@ -6,6 +6,7 @@ layout (set = 0, binding = 0) uniform Matrices { mat4 proj; float time; vec3 cam_pos; + vec3 cam_dir; vec4 frustum[6]; vec2 viewport; float tess_factor; diff --git a/assets/shaders/terrain.tesc.spv b/assets/shaders/terrain.tesc.spv index 720e58b..488d37a 100644 Binary files a/assets/shaders/terrain.tesc.spv and b/assets/shaders/terrain.tesc.spv differ diff --git a/assets/shaders/terrain.tese b/assets/shaders/terrain.tese index dc0f379..cda3c84 100644 --- a/assets/shaders/terrain.tese +++ b/assets/shaders/terrain.tese @@ -5,6 +5,7 @@ layout (set = 0, binding = 0) uniform Matrices { mat4 proj; float time; vec3 cam_pos; + vec3 cam_dir; vec4 frustum[6]; vec2 viewport; float tess_factor; diff --git a/assets/shaders/terrain.tese.spv b/assets/shaders/terrain.tese.spv index c92bf8b..3dca697 100644 Binary files a/assets/shaders/terrain.tese.spv and b/assets/shaders/terrain.tese.spv differ