Fixed uniform buffer padding issue, still dealing with tesselation error

This commit is contained in:
Conál 2024-02-05 13:21:25 -05:00
parent 9582baf2d2
commit 82f0785cae
10 changed files with 32 additions and 4 deletions

View File

@ -223,6 +223,8 @@ Renderer::Renderer(Window& win) : win(win) {
terrain_pipeline = std::make_unique<GraphicsPipeline>(dev, terrain_shaders, swapchain->extent, *render_pass, bindings, *terrain->vertex_buffer, GraphicsPipeline::eTERRAIN); terrain_pipeline = std::make_unique<GraphicsPipeline>(dev, terrain_shaders, swapchain->extent, *render_pass, bindings, *terrain->vertex_buffer, GraphicsPipeline::eTERRAIN);
terrain_pipeline->update(1, textures[1]);
for (auto& shader : shaders) for (auto& shader : shaders)
shader.cleanup(); shader.cleanup();
for (auto& shader : terrain_shaders) for (auto& shader : terrain_shaders)

View File

@ -73,6 +73,6 @@ struct Renderer {
float speed = 1.0; float speed = 1.0;
bool running = true; bool running = true;
float tess_factor = 5.0f; float tess_factor = 1.0f;
float tess_edge_size = 20.0f; float tess_edge_size = 20.0f;
}; };

View File

@ -1,10 +1,24 @@
#include <Renderer/UniformBuffer.hpp> #include <Renderer/UniformBuffer.hpp>
#include <util/log.hpp>
UniformBuffer::UniformBuffer(vk::PhysicalDevice phys_dev, vk::Device dev) { UniformBuffer::UniformBuffer(vk::PhysicalDevice phys_dev, vk::Device dev) {
buffer = std::make_unique<Buffer>(phys_dev, dev, sizeof(UniformData), buffer = std::make_unique<Buffer>(phys_dev, dev, sizeof(UniformData),
vk::BufferUsageFlagBits::eUniformBuffer, vk::BufferUsageFlagBits::eUniformBuffer,
vk::MemoryPropertyFlagBits::eHostCoherent | vk::MemoryPropertyFlagBits::eHostVisible vk::MemoryPropertyFlagBits::eHostCoherent | vk::MemoryPropertyFlagBits::eHostVisible
); );
Log::debug("Offset of view: %zu\n", offsetof(UniformData, view));
Log::debug("Offset of proj: %zu\n", offsetof(UniformData, proj));
Log::debug("Offset of time: %zu\n", offsetof(UniformData, time));
Log::debug("Offset of pad0: %zu\n", offsetof(UniformData, pad0));
Log::debug("Offset of pad1: %zu\n", offsetof(UniformData, pad1));
Log::debug("Offset of pad2: %zu\n", offsetof(UniformData, pad2));
Log::debug("Offset of cam_pos: %zu\n", offsetof(UniformData, cam_pos));
Log::debug("Offset of viewport: %zu\n", offsetof(UniformData, viewport));
Log::debug("Offset of tess_factor: %zu\n", offsetof(UniformData, tess_factor));
Log::debug("Offset of tess_edge_size: %zu\n", offsetof(UniformData, tess_edge_size));
} }
void UniformBuffer::upload(const UniformData& data) { void UniformBuffer::upload(const UniformData& data) {

View File

@ -13,7 +13,11 @@ struct UniformData {
glm::mat4 view; glm::mat4 view;
glm::mat4 proj; glm::mat4 proj;
float time; float time;
float pad0;
float pad1;
float pad2;
glm::vec3 cam_pos; glm::vec3 cam_pos;
float pad3;
glm::vec2 viewport; glm::vec2 viewport;
float tess_factor; float tess_factor;
float tess_edge_size; float tess_edge_size;

View File

@ -5,7 +5,6 @@
float Terrain::getHeight(int32_t x, int32_t y) { float Terrain::getHeight(int32_t x, int32_t y) {
Log::debug("Height queried at %d, %d\n", x, y);
if (x < 0) if (x < 0)
x += 64; x += 64;
if (y < 0) if (y < 0)

View File

@ -19,4 +19,4 @@ layout (set = 0, binding = 1) uniform sampler2D tex;
void main() { void main() {
FragColor = vec4(1.0); FragColor = vec4(1.0);
} }

View File

@ -45,12 +45,21 @@ float screen_space_tess(vec4 p0, vec4 p1) {
} }
void main() { void main() {
if(gl_InvocationID == 0) { if(gl_InvocationID == 0) {
/*
gl_TessLevelOuter[0] = screen_space_tess(gl_in[3].gl_Position, gl_in[0].gl_Position); gl_TessLevelOuter[0] = screen_space_tess(gl_in[3].gl_Position, gl_in[0].gl_Position);
gl_TessLevelOuter[1] = screen_space_tess(gl_in[0].gl_Position, gl_in[1].gl_Position); gl_TessLevelOuter[1] = screen_space_tess(gl_in[0].gl_Position, gl_in[1].gl_Position);
gl_TessLevelOuter[2] = screen_space_tess(gl_in[1].gl_Position, gl_in[2].gl_Position); gl_TessLevelOuter[2] = screen_space_tess(gl_in[1].gl_Position, gl_in[2].gl_Position);
gl_TessLevelOuter[3] = screen_space_tess(gl_in[2].gl_Position, gl_in[3].gl_Position); gl_TessLevelOuter[3] = screen_space_tess(gl_in[2].gl_Position, gl_in[3].gl_Position);
gl_TessLevelInner[0] = mix(gl_TessLevelOuter[0], gl_TessLevelOuter[3], 0.5); gl_TessLevelInner[0] = mix(gl_TessLevelOuter[0], gl_TessLevelOuter[3], 0.5);
gl_TessLevelInner[1] = mix(gl_TessLevelOuter[2], gl_TessLevelOuter[1], 0.5);*/
gl_TessLevelOuter[0] = tess_factor;
gl_TessLevelOuter[1] = tess_factor;
gl_TessLevelOuter[2] = tess_factor;
gl_TessLevelOuter[3] = tess_factor;
gl_TessLevelInner[0] = mix(gl_TessLevelOuter[0], gl_TessLevelOuter[3], 0.5);
gl_TessLevelInner[1] = mix(gl_TessLevelOuter[2], gl_TessLevelOuter[1], 0.5); gl_TessLevelInner[1] = mix(gl_TessLevelOuter[2], gl_TessLevelOuter[1], 0.5);
} }

Binary file not shown.

View File

@ -39,7 +39,7 @@ void main() {
vec4 pos2 = mix(gl_in[3].gl_Position, gl_in[2].gl_Position, gl_TessCoord.x); vec4 pos2 = mix(gl_in[3].gl_Position, gl_in[2].gl_Position, gl_TessCoord.x);
vec4 fpos = mix(pos1, pos2, gl_TessCoord.y); vec4 fpos = mix(pos1, pos2, gl_TessCoord.y);
fpos.y += textureLod(heightmap, _texCoord, 0.0).r; fpos.y += 5.0 * textureLod(heightmap, _texCoord, 0.0).r;
_pos = fpos.xyz; _pos = fpos.xyz;
gl_Position = proj * view * fpos; gl_Position = proj * view * fpos;

Binary file not shown.