Signed-off-by: Slendi <slendi@socopon.com>
This commit is contained in:
2025-12-11 21:12:12 +02:00
parent a1061c873a
commit c856e0414c
7 changed files with 55 additions and 15 deletions

View File

@@ -19,6 +19,7 @@ shader_sources = files(
'triangle.vert',
'triangle_mesh.frag',
'triangle_mesh.vert',
'tex_image.frag',
)
spirv_shaders = []

13
shaders/tex_image.frag Normal file
View File

@@ -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);
}

View File

@@ -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;

View File

@@ -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 });

View File

@@ -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);

View File

@@ -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<float>(m_vk.draw_extent.width)
/ static_cast<float>(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<float>(m_vk.draw_extent.width)
/ static_cast<float>(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 }),

View File

@@ -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 {};