From c856e0414cb63a1a57f61427ae2bda63e286a9f4 Mon Sep 17 00:00:00 2001 From: Slendi Date: Thu, 11 Dec 2025 21:12:12 +0200 Subject: [PATCH] Textures Signed-off-by: Slendi --- shaders/meson.build | 1 + shaders/tex_image.frag | 13 ++++++++++ shaders/triangle_mesh.vert | 2 +- src/Application.cpp | 1 + src/Loader.cpp | 2 +- src/VulkanRenderer.cpp | 49 ++++++++++++++++++++++++++++---------- src/VulkanRenderer.h | 2 ++ 7 files changed, 55 insertions(+), 15 deletions(-) create mode 100644 shaders/tex_image.frag diff --git a/shaders/meson.build b/shaders/meson.build index c903de9..232fd5e 100644 --- a/shaders/meson.build +++ b/shaders/meson.build @@ -19,6 +19,7 @@ shader_sources = files( 'triangle.vert', 'triangle_mesh.frag', 'triangle_mesh.vert', + 'tex_image.frag', ) spirv_shaders = [] diff --git a/shaders/tex_image.frag b/shaders/tex_image.frag new file mode 100644 index 0000000..7c7685e --- /dev/null +++ b/shaders/tex_image.frag @@ -0,0 +1,13 @@ +#version 450 + +layout (location = 0) in vec3 in_color; +layout (location = 1) in vec2 in_uv; + +layout (location = 0) out vec4 out_frag_color; + +layout (set = 0, binding = 0) uniform sampler2D tex; + +void main() { + out_frag_color = texture(tex, in_uv) * vec4(in_color, 1.0f); +} + diff --git a/shaders/triangle_mesh.vert b/shaders/triangle_mesh.vert index a9871c4..ebf6786 100644 --- a/shaders/triangle_mesh.vert +++ b/shaders/triangle_mesh.vert @@ -2,7 +2,7 @@ #extension GL_EXT_buffer_reference : require layout (location = 0) out vec3 out_color; -layout (location = 1) out vec3 out_uv; +layout (location = 1) out vec2 out_uv; struct Vertex { vec3 position; diff --git a/src/Application.cpp b/src/Application.cpp index 0db1810..a8c7f4b 100644 --- a/src/Application.cpp +++ b/src/Application.cpp @@ -89,6 +89,7 @@ auto Application::run() -> void ImGui::NewFrame(); if (m_show_imgui) { + ImGui::SetNextWindowCollapsed(true, ImGuiCond_Once); ImGui::ShowDemoWindow(); ImGui::SetNextWindowSize({ 100, 50 }); diff --git a/src/Loader.cpp b/src/Loader.cpp index a95d1c7..6996353 100644 --- a/src/Loader.cpp +++ b/src/Loader.cpp @@ -178,7 +178,7 @@ auto Mesh::load_gltf_meshes( } } - constexpr bool OVERRIDE_COLORS = true; + constexpr bool OVERRIDE_COLORS = false; if (OVERRIDE_COLORS) { for (auto &vtx : vertices) { vtx.color = smath::Vec4(vtx.normal, 1.f); diff --git a/src/VulkanRenderer.cpp b/src/VulkanRenderer.cpp index 7a3a55e..bc0fcc2 100644 --- a/src/VulkanRenderer.cpp +++ b/src/VulkanRenderer.cpp @@ -356,6 +356,15 @@ auto VulkanRenderer::descriptors_init() -> void vkDestroyDescriptorSetLayout( m_vkb.dev, m_vk.gpu_scene_data_descriptor_layout, nullptr); }); + + m_vk.single_image_descriptor_layout + = DescriptorLayoutBuilder() + .add_binding(0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER) + .build(m_logger, m_vkb.dev, VK_SHADER_STAGE_FRAGMENT_BIT); + m_vk.deletion_queue.emplace([&]() { + vkDestroyDescriptorSetLayout( + m_vkb.dev, m_vk.single_image_descriptor_layout, nullptr); + }); } auto VulkanRenderer::pipelines_init() -> void @@ -479,7 +488,7 @@ auto VulkanRenderer::mesh_pipeline_init() -> void } uint8_t triangle_frag_shader_data[] { -#embed "triangle_mesh_frag.spv" +#embed "tex_image_frag.spv" }; VkShaderModule triangle_frag_shader {}; if (!vkutil::load_shader_module( @@ -499,6 +508,8 @@ auto VulkanRenderer::mesh_pipeline_init() -> void layout_ci.pNext = nullptr; layout_ci.pushConstantRangeCount = 1; layout_ci.pPushConstantRanges = &push_constant_range; + layout_ci.setLayoutCount = 1; + layout_ci.pSetLayouts = &m_vk.single_image_descriptor_layout; VK_CHECK(m_logger, vkCreatePipelineLayout( @@ -862,18 +873,6 @@ auto VulkanRenderer::draw_geometry(VkCommandBuffer cmd) -> void vkCmdBeginRendering(cmd, &render_info); - auto view { smath::matrix_look_at(smath::Vec3 { 0.0f, 0.0f, 3.0f }, - smath::Vec3 { 0.0f, 0.0f, 0.0f }, smath::Vec3 { 0.0f, 1.0f, 0.0f }, - false) }; - auto projection { - smath::matrix_perspective(smath::deg(70.0f), - static_cast(m_vk.draw_extent.width) - / static_cast(m_vk.draw_extent.height), - 0.1f, 10000.0f), - }; - projection[1][1] *= -1; - auto view_projection { projection * view }; - vkCmdBindPipeline( cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, m_vk.triangle_pipeline); @@ -894,6 +893,30 @@ auto VulkanRenderer::draw_geometry(VkCommandBuffer cmd) -> void vkCmdBindPipeline(cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, m_vk.mesh_pipeline); + auto const image_set { m_vk.get_current_frame().frame_descriptors.allocate( + m_logger, m_vkb.dev, m_vk.single_image_descriptor_layout) }; + DescriptorWriter() + .write_image(0, m_vk.error_image.image_view, + m_vk.default_sampler_nearest, + VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, + VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER) + .update_set(m_vkb.dev, image_set); + + vkCmdBindDescriptorSets(cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, + m_vk.mesh_pipeline_layout, 0, 1, &image_set, 0, nullptr); + + auto view { smath::matrix_look_at(smath::Vec3 { 0.0f, 0.0f, 3.0f }, + smath::Vec3 { 0.0f, 0.0f, 0.0f }, smath::Vec3 { 0.0f, 1.0f, 0.0f }, + false) }; + auto projection { + smath::matrix_perspective(smath::deg(70.0f), + static_cast(m_vk.draw_extent.width) + / static_cast(m_vk.draw_extent.height), + 0.1f, 10000.0f), + }; + projection[1][1] *= -1; + auto view_projection { projection * view }; + GPUDrawPushConstants push_constants; auto rect_model { smath::scale( smath::translate(smath::Vec3 { 0.0f, 0.0f, -5.0f }), diff --git a/src/VulkanRenderer.h b/src/VulkanRenderer.h index d804a67..cf7730b 100644 --- a/src/VulkanRenderer.h +++ b/src/VulkanRenderer.h @@ -112,6 +112,8 @@ private: GPUSceneData scene_data {}; VkDescriptorSetLayout gpu_scene_data_descriptor_layout; + VkDescriptorSetLayout single_image_descriptor_layout; + VkPipeline gradient_pipeline {}; VkPipelineLayout gradient_pipeline_layout {};