diff --git a/Renderer/Renderer.cpp b/Renderer/Renderer.cpp index ea89672..0729e0f 100644 --- a/Renderer/Renderer.cpp +++ b/Renderer/Renderer.cpp @@ -339,7 +339,8 @@ void Renderer::draw() { uniform_buffer->upload(UniformData { - .mvp = p * cam.view(), + .view = cam.view(), + .proj = p, .time = time, .cam_pos = cam.pos, .viewport = glm::vec2(viewport.width, viewport.y), diff --git a/Renderer/Renderer.hpp b/Renderer/Renderer.hpp index f43dd23..b884cc1 100644 --- a/Renderer/Renderer.hpp +++ b/Renderer/Renderer.hpp @@ -73,6 +73,6 @@ struct Renderer { float speed = 1.0; bool running = true; - float tess_factor; + float tess_factor = 5.0f; float tess_edge_size = 20.0f; }; diff --git a/Renderer/UniformBuffer.hpp b/Renderer/UniformBuffer.hpp index b1b3c61..1b5f69b 100644 --- a/Renderer/UniformBuffer.hpp +++ b/Renderer/UniformBuffer.hpp @@ -10,7 +10,8 @@ #include struct UniformData { - glm::mat4 mvp; + glm::mat4 view; + glm::mat4 proj; float time; glm::vec3 cam_pos; glm::vec2 viewport; diff --git a/Resources/Texture.hpp b/Resources/Texture.hpp index 60b230e..8215f92 100644 --- a/Resources/Texture.hpp +++ b/Resources/Texture.hpp @@ -27,7 +27,7 @@ struct Texture { .binding = binding, .descriptorType = vk::DescriptorType::eCombinedImageSampler, .descriptorCount = 1, - .stageFlags = vk::ShaderStageFlagBits::eFragment, + .stageFlags = vk::ShaderStageFlagBits::eFragment | vk::ShaderStageFlagBits::eTessellationEvaluation, .pImmutableSamplers = nullptr, }; } diff --git a/Scene/Terrain.cpp b/Scene/Terrain.cpp index 9e96954..655f05b 100644 --- a/Scene/Terrain.cpp +++ b/Scene/Terrain.cpp @@ -33,7 +33,7 @@ Terrain::Terrain(vk::PhysicalDevice phys_dev, vk::Device dev, Texture& tex) : ph .pos = glm::vec3( 2.0f * x + 1.0f - patch_size, 0.0f, - 2.0f * y * 1.0f - patch_size), + 2.0f * y + 1.0f - patch_size), .uv = glm::vec2(static_cast(x)/patch_size, static_cast(y) / patch_size) * uv_scale, }); @@ -88,7 +88,7 @@ Terrain::Terrain(vk::PhysicalDevice phys_dev, vk::Device dev, Texture& tex) : ph for (auto x = 0_u32; x < w; x++) for (auto y = 0_u32; y < w; y++) { - auto idx = x + y * w * 4; + auto idx = (x + y * w) * 4; indices[idx] = x+y*patch_size; indices[idx+1] = indices[idx] + patch_size; indices[idx+2] = indices[idx+1] + 1; diff --git a/UI/UI.cpp b/UI/UI.cpp index be28d5b..dc3accc 100644 --- a/UI/UI.cpp +++ b/UI/UI.cpp @@ -92,8 +92,8 @@ void UI::newFrame() { ImGui::Text("FPS: %f", info.fps); ImGui::Text("Time: %f", info.time); ImGui::Checkbox("Fly Camera", &info.flycam); - ImGui::SliderFloat("Tessellation Factor: %f", &info.tess_factor, 0.0, 20.0); - ImGui::SliderFloat("Edge Size: %f", &info.tess_edge_size, 0.0, 40.0); + ImGui::SliderFloat("Tessellation Factor", &info.tess_factor, 0.0, 20.0); + ImGui::SliderFloat("Edge Size", &info.tess_edge_size, 0.0, 40.0); ImGui::End(); } diff --git a/assets/shaders/terrain.frag b/assets/shaders/terrain.frag index bebcef2..a0c74d2 100644 --- a/assets/shaders/terrain.frag +++ b/assets/shaders/terrain.frag @@ -6,9 +6,13 @@ 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; + vec2 viewport; + float tess_factor; + float tess_edge_size; }; layout (set = 0, binding = 1) uniform sampler2D tex; diff --git a/assets/shaders/terrain.frag.spv b/assets/shaders/terrain.frag.spv index dfca963..13e9814 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 61de8fe..cf806ab 100644 --- a/assets/shaders/terrain.tesc +++ b/assets/shaders/terrain.tesc @@ -1,7 +1,8 @@ #version 450 core layout (set = 0, binding = 0) uniform Matrices { - mat4 mvp; + mat4 view; + mat4 proj; float time; vec3 cam_pos; vec2 viewport; @@ -24,14 +25,14 @@ layout (location = 2) out vec3 _pos[4]; float screen_space_tess(vec4 p0, vec4 p1) { /* calc midpoint + distance btw the two points */ - vec4 mid = (p0+p1) / 2.0; + vec4 mid = (p0+p1) * 0.5; float r = distance(p0, p1) / 2.0; - vec4 v0 = mvp * mid; + vec4 v0 = view * mid; /* projevt into clip spaace */ - vec4 clip0 = mvp * (v0 - vec4(r, 0.0, 0.0, 0.0)); - vec4 clip1 = mvp * (v0 + vec4(r, 0.0, 0.0, 0.0)); + vec4 clip0 = proj * (v0 - vec4(r, 0.0, 0.0, 0.0)); + vec4 clip1 = proj * (v0 + vec4(r, 0.0, 0.0, 0.0)); clip0 /= clip0.w; clip1 /= clip1.w; diff --git a/assets/shaders/terrain.tesc.spv b/assets/shaders/terrain.tesc.spv index 0752442..541f227 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 ab83884..c6ce865 100644 --- a/assets/shaders/terrain.tese +++ b/assets/shaders/terrain.tese @@ -1,7 +1,8 @@ #version 450 core layout (set = 0, binding = 0) uniform Matrices { - mat4 mvp; + mat4 view; + mat4 proj; float time; vec3 cam_pos; vec2 viewport; @@ -36,7 +37,10 @@ void main() { /* not displacing yet */ vec4 pos1 = mix(gl_in[0].gl_Position, gl_in[1].gl_Position, gl_TessCoord.x); vec4 pos2 = mix(gl_in[3].gl_Position, gl_in[2].gl_Position, gl_TessCoord.x); - _pos = mix(pos1, pos2, gl_TessCoord.y).xyz; - gl_Position = mvp * mix(pos1, pos2, gl_TessCoord.y); + vec4 fpos = mix(pos1, pos2, gl_TessCoord.y); + fpos.y += textureLod(heightmap, _texCoord, 0.0).r; + + _pos = fpos.xyz; + gl_Position = proj * view * fpos; } \ No newline at end of file diff --git a/assets/shaders/terrain.tese.spv b/assets/shaders/terrain.tese.spv index 5253329..ab18d3a 100644 Binary files a/assets/shaders/terrain.tese.spv and b/assets/shaders/terrain.tese.spv differ diff --git a/assets/shaders/terrain.vert b/assets/shaders/terrain.vert index 55b4d11..eaf4d57 100644 --- a/assets/shaders/terrain.vert +++ b/assets/shaders/terrain.vert @@ -8,8 +8,13 @@ layout (location = 1) out vec2 texCoord; layout (location = 2) out vec3 pos; layout (set = 0, binding = 0) uniform Matrices { - mat4 mvp; + mat4 view; + mat4 proj; float time; + vec3 cam_pos; + vec2 viewport; + float tess_factor; + float tess_edge_size; }; void main() { diff --git a/assets/shaders/terrain.vert.spv b/assets/shaders/terrain.vert.spv index f6a38da..e232378 100644 Binary files a/assets/shaders/terrain.vert.spv and b/assets/shaders/terrain.vert.spv differ