diff --git a/assets/models/level_scene.glb b/assets/models/level_scene.glb index 10ec7ca..3cbbbf3 100644 Binary files a/assets/models/level_scene.glb and b/assets/models/level_scene.glb differ diff --git a/assets/models/level_scene.glb.bak b/assets/models/level_scene.glb.bak new file mode 100644 index 0000000..10ec7ca Binary files /dev/null and b/assets/models/level_scene.glb.bak differ diff --git a/assets/shaders/composite.slang b/assets/shaders/composite.slang index 1c5af89..3717639 100644 --- a/assets/shaders/composite.slang +++ b/assets/shaders/composite.slang @@ -22,8 +22,8 @@ float4 frag_main(post_transform_vertex input) : SV_Target { uv.y = 1.0f - uv.y; let normal = normals.Sample(uv).xyz; let albedo = albedos.Sample(uv).xyz; - let lighting = saturate(dot(float3(0.0f, 1.0f, 0.0f), normal)) * 0.00001f; - //return float4(input.uv + (normal * albedo * 0.00001f).xy, 1.0f, 1.0f); - return float4(lighting * albedo + (normal), 1.0f); -// return float4(1.0f); + let lighting = saturate(dot(albedo, normal)) * 0.01f; +// return float4(input.uv + (normal * albedo * 0.00001f).xy, 1.0f, 1.0f); + return float4(lighting + albedo, 1.0f); + //return float4(lighting + float3(1.0f), 1.0f); } diff --git a/assets/shaders/render_mesh.slang b/assets/shaders/render_mesh.slang index 2108cb9..d11dd58 100644 --- a/assets/shaders/render_mesh.slang +++ b/assets/shaders/render_mesh.slang @@ -12,6 +12,7 @@ struct input_vertex struct post_transform_vertex { float4 position : SV_Position; float3 normal : NORMAL; + float2 uv : TEXCOORD; }; [shader("vertex")] @@ -19,8 +20,8 @@ post_transform_vertex vert_main(input_vertex vertex) { post_transform_vertex output; output.position = mul(camera.projection, mul(camera.view, float4(vertex.pos, 1.0f))); - output.normal = vertex.normal; + output.uv = vertex.texcoord; return output; } @@ -35,7 +36,7 @@ fragment_output frag_main(post_transform_vertex input) : SV_Target { fragment_output output; output.normal = float4(normalize(input.normal), 1.0f); - output.albedo = float4(1.0f); + output.albedo = float4(input.uv, 1.0f, 1.0f); return output; } diff --git a/source/game/engine.cpp b/source/game/engine.cpp index 92b56c9..478d289 100644 --- a/source/game/engine.cpp +++ b/source/game/engine.cpp @@ -116,7 +116,7 @@ void engine::run() { try { const auto [map_min, map_max] = ::bounds_of(level_border); const auto [view, projection] = ::calculate_camera_matrices( - map_min, map_max, 1920.0f / 1080.0f, 2.8f); + map_min, map_max, 1920.0f / 1080.0f, 1.1f); renderer.render(level_border_render_ids, view, projection); } catch (const vuk::VkException &ex) { if (ex.what() != std::string("Out of date.")) { diff --git a/source/game/model.cpp b/source/game/model.cpp index 3d76c5f..10ec161 100644 --- a/source/game/model.cpp +++ b/source/game/model.cpp @@ -20,6 +20,9 @@ namespace { auto *normal_it = it->findAttribute("NORMAL"); assert(normal_it != it->attributes.end()); + auto *texcoord_it = it->findAttribute("TEXCOORD_0"); + assert(texcoord_it != it->attributes.end()); + const auto index = std::distance(mesh.primitives.begin(), it); auto &primitive = meshes.emplace_back(); @@ -67,11 +70,27 @@ namespace { }); } - for (const auto [position, normal] : std::views::zip(positions, normals)) { + auto texcoords = std::vector(); + { + auto &texcoord_accessor = asset.accessors[texcoord_it->accessorIndex]; + if (!texcoord_accessor.bufferViewIndex.has_value()) { + throw std::runtime_error( + "no index buffer was specified for mesh primitive"); + } + + fastgltf::iterateAccessorWithIndex( + asset, texcoord_accessor, + [&](fastgltf::math::fvec2 uv, std::size_t idx) { + texcoords.emplace_back(uv.x(), uv.y()); + }); + } + + for (const auto [position, normal, texcoord] : + std::views::zip(positions, normals, texcoords)) { primitive.vertices.push_back({ .position = position, .normal = normal, - .uv = glm::vec2(), + .uv = texcoord, }); } } diff --git a/source/render/renderer.cpp b/source/render/renderer.cpp index fff799a..6543d9b 100644 --- a/source/render/renderer.cpp +++ b/source/render/renderer.cpp @@ -32,8 +32,8 @@ [[nodiscard]] auto composite() { return vuk::make_pass("composite", [](vuk::CommandBuffer &command_buffer, - VUK_IA(vuk::eFragmentRead) normals, - VUK_IA(vuk::eFragmentRead) albedos, + VUK_IA(vuk::eFragmentSampled) normals, + VUK_IA(vuk::eFragmentSampled) albedos, VUK_IA(vuk::eColorWrite) target) { command_buffer.bind_graphics_pipeline("composite") .set_dynamic_state(vuk::DynamicStateFlagBits::eScissor |