diff --git a/src/common/rendering/vulkan/descriptorsets/vk_descriptorset.cpp b/src/common/rendering/vulkan/descriptorsets/vk_descriptorset.cpp index e5426499f..5f89cc24b 100644 --- a/src/common/rendering/vulkan/descriptorsets/vk_descriptorset.cpp +++ b/src/common/rendering/vulkan/descriptorsets/vk_descriptorset.cpp @@ -407,8 +407,9 @@ void VkDescriptorSetManager::UpdateBindlessDescriptorSet() int index = FixedBindlessSlots; for (auto& lightmap : fb->GetTextureManager()->Lightmaps) { - Bindless.Writer.AddCombinedImageSampler(Bindless.Set.get(), 0, index, lightmap.View.get(), sampler, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); - index++; + Bindless.Writer.AddCombinedImageSampler(Bindless.Set.get(), 0, index, lightmap.Light.View.get(), sampler, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); + Bindless.Writer.AddCombinedImageSampler(Bindless.Set.get(), 0, index + 1, lightmap.Probe.View.get(), sampler, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); + index += 2; } Bindless.Writer.Execute(fb->GetDevice()); diff --git a/src/common/rendering/vulkan/textures/vk_texture.cpp b/src/common/rendering/vulkan/textures/vk_texture.cpp index 82f35b5f3..072b8dbaf 100644 --- a/src/common/rendering/vulkan/textures/vk_texture.cpp +++ b/src/common/rendering/vulkan/textures/vk_texture.cpp @@ -836,32 +836,51 @@ void VkTextureManager::SetLightmapCount(int size, int count) for (int i = startIndex; i < count; i++) { - Lightmaps[i].Image = ImageBuilder() + Lightmaps[i].Light.Image = ImageBuilder() .Size(size, size) .Format(VK_FORMAT_R16G16B16A16_SFLOAT) .Usage(VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) .DebugName("VkTextureManager.Lightmap") .Create(fb->GetDevice()); - Lightmaps[i].View = ImageViewBuilder() + Lightmaps[i].Light.View = ImageViewBuilder() .Type(VK_IMAGE_VIEW_TYPE_2D) - .Image(Lightmaps[i].Image.get(), VK_FORMAT_R16G16B16A16_SFLOAT) + .Image(Lightmaps[i].Light.Image.get(), VK_FORMAT_R16G16B16A16_SFLOAT) .DebugName("VkTextureManager.LightmapView") .Create(fb->GetDevice()); + + Lightmaps[i].Probe.Image = ImageBuilder() + .Size(size, size) + .Format(VK_FORMAT_R16_UINT) + .Usage(VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) + .DebugName("VkTextureManager.Probemap") + .Create(fb->GetDevice()); + + Lightmaps[i].Probe.View = ImageViewBuilder() + .Type(VK_IMAGE_VIEW_TYPE_2D) + .Image(Lightmaps[i].Probe.Image.get(), VK_FORMAT_R16_UINT) + .DebugName("VkTextureManager.ProbemapView") + .Create(fb->GetDevice()); } auto cmdbuffer = fb->GetCommands()->GetTransferCommands(); VkImageTransition barrier; for (int i = startIndex; i < count; i++) - barrier.AddImage(&Lightmaps[i], VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, false); + { + barrier.AddImage(&Lightmaps[i].Light, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, false); + barrier.AddImage(&Lightmaps[i].Probe, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, false); + } barrier.Execute(cmdbuffer); } void VkTextureManager::CreateLightmap(int size, int count, const TArray& srcPixels) { for (auto& tex : Lightmaps) - tex.Reset(fb); + { + tex.Light.Reset(fb); + tex.Probe.Reset(fb); + } Lightmaps.clear(); Lightmaps.resize(count); @@ -871,18 +890,31 @@ void VkTextureManager::CreateLightmap(int size, int count, const TArrayGetDevice()); - Lightmaps[i].View = ImageViewBuilder() + Lightmaps[i].Light.View = ImageViewBuilder() .Type(VK_IMAGE_VIEW_TYPE_2D) - .Image(Lightmaps[i].Image.get(), VK_FORMAT_R16G16B16A16_SFLOAT) + .Image(Lightmaps[i].Light.Image.get(), VK_FORMAT_R16G16B16A16_SFLOAT) .DebugName("VkTextureManager.LightmapView") .Create(fb->GetDevice()); + + Lightmaps[i].Probe.Image = ImageBuilder() + .Size(w, h) + .Format(VK_FORMAT_R16_UINT) + .Usage(VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) + .DebugName("VkTextureManager.Probemap") + .Create(fb->GetDevice()); + + Lightmaps[i].Probe.View = ImageViewBuilder() + .Type(VK_IMAGE_VIEW_TYPE_2D) + .Image(Lightmaps[i].Probe.Image.get(), VK_FORMAT_R16_UINT) + .DebugName("VkTextureManager.ProbemapView") + .Create(fb->GetDevice()); } auto cmdbuffer = fb->GetCommands()->GetTransferCommands(); @@ -913,7 +945,10 @@ void VkTextureManager::CreateLightmap(int size, int count, const TArraycopyBufferToImage(stagingBuffer->buffer, Lightmaps[i].Image->image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, ®ion); + cmdbuffer->copyBufferToImage(stagingBuffer->buffer, Lightmaps[i].Light.Image->image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, ®ion); } fb->GetCommands()->TransferDeleteList->Add(std::move(stagingBuffer)); @@ -933,13 +968,16 @@ void VkTextureManager::CreateLightmap(int size, int count, const TArray Lightmaps; + std::vector Lightmaps; std::vector Irradiancemaps; std::vector Prefiltermaps; diff --git a/src/common/rendering/vulkan/vk_lightmapper.cpp b/src/common/rendering/vulkan/vk_lightmapper.cpp index 78ce63266..e8bdc1f4b 100644 --- a/src/common/rendering/vulkan/vk_lightmapper.cpp +++ b/src/common/rendering/vulkan/vk_lightmapper.cpp @@ -402,7 +402,7 @@ void VkLightmapper::CopyResult() if (pixels == 0) return; - std::vector& destTexture = fb->GetTextureManager()->Lightmaps; + std::vector& destTexture = fb->GetTextureManager()->Lightmaps; auto cmdbuffer = fb->GetCommands()->GetTransferCommands(); @@ -414,7 +414,7 @@ void VkLightmapper::CopyResult() for (unsigned int i = 0, count = copylists.Size(); i < count; i++) { if (copylists[i].Size() > 0) - barrier0.AddImage(destTexture[i].Image.get(), VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_ACCESS_SHADER_READ_BIT, VK_ACCESS_COLOR_ATTACHMENT_READ_BIT, VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1); + barrier0.AddImage(destTexture[i].Light.Image.get(), VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_ACCESS_SHADER_READ_BIT, VK_ACCESS_COLOR_ATTACHMENT_READ_BIT, VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1); } barrier0.Execute(cmdbuffer, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT); @@ -427,18 +427,18 @@ void VkLightmapper::CopyResult() if (list.Size() == 0) continue; - int destSize = destTexture[i].Image->width; + int destSize = destTexture[i].Light.Image->width; // Create framebuffer object if it doesn't exist - auto& framebuffer = destTexture[i].LMFramebuffer; + auto& framebuffer = destTexture[i].Light.LMFramebuffer; if (!framebuffer) { - auto& view = destTexture[i].LMView; + auto& view = destTexture[i].Light.LMView; if (!view) { view = ImageViewBuilder() .Type(VK_IMAGE_VIEW_TYPE_2D) - .Image(destTexture[i].Image.get(), VK_FORMAT_R16G16B16A16_SFLOAT, VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 1, 1) + .Image(destTexture[i].Light.Image.get(), VK_FORMAT_R16G16B16A16_SFLOAT, VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 1, 1) .DebugName("LMView") .Create(fb->GetDevice()); } @@ -499,7 +499,7 @@ void VkLightmapper::CopyResult() for (unsigned int i = 0, count = copylists.Size(); i < count; i++) { if (copylists[i].Size() > 0) - barrier1.AddImage(destTexture[i].Image.get(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, VK_ACCESS_SHADER_READ_BIT, VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1); + barrier1.AddImage(destTexture[i].Light.Image.get(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, VK_ACCESS_SHADER_READ_BIT, VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1); } barrier1.Execute(cmdbuffer, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT); diff --git a/wadsrc/static/shaders/scene/vert_main.glsl b/wadsrc/static/shaders/scene/vert_main.glsl index 365fb5d6e..969a50fd5 100644 --- a/wadsrc/static/shaders/scene/vert_main.glsl +++ b/wadsrc/static/shaders/scene/vert_main.glsl @@ -137,7 +137,7 @@ void main() #if !defined(SIMPLE) || defined(SIMPLE3D) vLightmap = aLightmap; if (aPosition.w >= 0.0) - vLightmapIndex = LightmapsStart + int(aPosition.w); + vLightmapIndex = LightmapsStart + int(aPosition.w) * 2; else vLightmapIndex = -1;