Add tile world position information to lightmapper copy pass
This commit is contained in:
parent
8faa4e65bc
commit
1efa5b19cd
7 changed files with 99 additions and 13 deletions
|
|
@ -48,6 +48,14 @@ struct LightmapTile
|
|||
FVector3 ProjLocalToV = { 0.0f, 0.0f, 0.0f };
|
||||
} Transform;
|
||||
|
||||
// Calculate world coordinates from UV coordinates
|
||||
struct
|
||||
{
|
||||
FVector3 WorldOrigin;
|
||||
FVector3 WorldU;
|
||||
FVector3 WorldV;
|
||||
} InverseTransform;
|
||||
|
||||
int UseCount = 0;
|
||||
bool AddedThisFrame = false;
|
||||
|
||||
|
|
@ -180,14 +188,43 @@ struct LightmapTile
|
|||
height = textureSize;
|
||||
}
|
||||
|
||||
Transform.TranslateWorldToLocal.X = uvMin.X * SampleDimension + 0.1f;
|
||||
Transform.TranslateWorldToLocal.Y = uvMin.Y * SampleDimension + 0.1f;
|
||||
Transform.TranslateWorldToLocal.Z = uvMin.Z * SampleDimension + 0.1f;
|
||||
uvMin *= (float)SampleDimension;
|
||||
uvMax *= (float)SampleDimension;
|
||||
|
||||
Transform.TranslateWorldToLocal.X = uvMin.X + 0.1f;
|
||||
Transform.TranslateWorldToLocal.Y = uvMin.Y + 0.1f;
|
||||
Transform.TranslateWorldToLocal.Z = uvMin.Z + 0.1f;
|
||||
|
||||
Transform.ProjLocalToU = tCoords[0];
|
||||
Transform.ProjLocalToV = tCoords[1];
|
||||
|
||||
switch (planeAxis)
|
||||
{
|
||||
default:
|
||||
case AXIS_YZ:
|
||||
InverseTransform.WorldOrigin = PointAtYZ(uvMin.Y, uvMin.Z);
|
||||
InverseTransform.WorldU = PointAtYZ(uvMax.Y, uvMin.Z);
|
||||
InverseTransform.WorldV = PointAtYZ(uvMin.Y, uvMax.Z);
|
||||
break;
|
||||
|
||||
case AXIS_XZ:
|
||||
InverseTransform.WorldOrigin = PointAtXZ(uvMin.X, uvMin.Z);
|
||||
InverseTransform.WorldU = PointAtXZ(uvMax.X, uvMin.Z);
|
||||
InverseTransform.WorldV = PointAtXZ(uvMin.X, uvMax.Z);
|
||||
break;
|
||||
|
||||
case AXIS_XY:
|
||||
InverseTransform.WorldOrigin = PointAtXY(uvMin.X, uvMin.Y);
|
||||
InverseTransform.WorldU = PointAtXY(uvMax.X, uvMin.Y);
|
||||
InverseTransform.WorldV = PointAtXY(uvMin.X, uvMax.Y);
|
||||
break;
|
||||
}
|
||||
|
||||
AtlasLocation.Width = width;
|
||||
AtlasLocation.Height = height;
|
||||
}
|
||||
|
||||
FVector3 PointAtYZ(float y, float z) const { return FVector3(-(Plane.Y * y + Plane.Z * z + Plane.W) / Plane.X, y, z); }
|
||||
FVector3 PointAtXZ(float x, float z) const { return FVector3(x, -(Plane.X * x + Plane.Z * z + Plane.W) / Plane.Y, z); }
|
||||
FVector3 PointAtXY(float x, float y) const { return FVector3(x, y, -(Plane.X * x + Plane.Y * y + Plane.W) / Plane.Z); }
|
||||
};
|
||||
|
|
|
|||
|
|
@ -414,7 +414,10 @@ void VkLightmapper::CopyResult()
|
|||
for (unsigned int i = 0, count = copylists.Size(); i < count; i++)
|
||||
{
|
||||
if (copylists[i].Size() > 0)
|
||||
{
|
||||
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.AddImage(destTexture[i].Probe.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);
|
||||
|
||||
|
|
@ -433,20 +436,31 @@ void VkLightmapper::CopyResult()
|
|||
auto& framebuffer = destTexture[i].Light.LMFramebuffer;
|
||||
if (!framebuffer)
|
||||
{
|
||||
auto& view = destTexture[i].Light.LMView;
|
||||
if (!view)
|
||||
auto& lightView = destTexture[i].Light.LMView;
|
||||
if (!lightView)
|
||||
{
|
||||
view = ImageViewBuilder()
|
||||
lightView = ImageViewBuilder()
|
||||
.Type(VK_IMAGE_VIEW_TYPE_2D)
|
||||
.Image(destTexture[i].Light.Image.get(), VK_FORMAT_R16G16B16A16_SFLOAT, VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 1, 1)
|
||||
.DebugName("LMView")
|
||||
.DebugName("LMLightView")
|
||||
.Create(fb->GetDevice());
|
||||
}
|
||||
|
||||
auto& probeView = destTexture[i].Probe.LMView;
|
||||
if (!probeView)
|
||||
{
|
||||
probeView = ImageViewBuilder()
|
||||
.Type(VK_IMAGE_VIEW_TYPE_2D)
|
||||
.Image(destTexture[i].Probe.Image.get(), VK_FORMAT_R16_UINT, VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 1, 1)
|
||||
.DebugName("LMProbeView")
|
||||
.Create(fb->GetDevice());
|
||||
}
|
||||
|
||||
framebuffer = FramebufferBuilder()
|
||||
.RenderPass(copy.renderPass.get())
|
||||
.Size(destSize, destSize)
|
||||
.AddAttachment(view.get())
|
||||
.AddAttachment(lightView.get())
|
||||
.AddAttachment(probeView.get())
|
||||
.DebugName("LMFramebuffer")
|
||||
.Create(fb->GetDevice());
|
||||
}
|
||||
|
|
@ -464,6 +478,9 @@ void VkLightmapper::CopyResult()
|
|||
copyinfo->DestPosY = tile->AtlasLocation.Y;
|
||||
copyinfo->TileWidth = tile->AtlasLocation.Width;
|
||||
copyinfo->TileHeight = tile->AtlasLocation.Height;
|
||||
copyinfo->WorldOrigin = tile->InverseTransform.WorldOrigin;
|
||||
copyinfo->WorldU = tile->InverseTransform.WorldU;
|
||||
copyinfo->WorldV = tile->InverseTransform.WorldV;
|
||||
}
|
||||
|
||||
// Draw the tiles. One instance per tile.
|
||||
|
|
@ -499,7 +516,10 @@ void VkLightmapper::CopyResult()
|
|||
for (unsigned int i = 0, count = copylists.Size(); i < count; i++)
|
||||
{
|
||||
if (copylists[i].Size() > 0)
|
||||
{
|
||||
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.AddImage(destTexture[i].Probe.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);
|
||||
|
||||
|
|
@ -883,8 +903,16 @@ void VkLightmapper::CreateCopyPipeline()
|
|||
VK_ATTACHMENT_STORE_OP_STORE,
|
||||
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
|
||||
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL)
|
||||
.AddAttachment(
|
||||
VK_FORMAT_R16_UINT,
|
||||
VK_SAMPLE_COUNT_1_BIT,
|
||||
VK_ATTACHMENT_LOAD_OP_LOAD,
|
||||
VK_ATTACHMENT_STORE_OP_STORE,
|
||||
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
|
||||
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL)
|
||||
.AddSubpass()
|
||||
.AddSubpassColorAttachmentRef(0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL)
|
||||
.AddSubpassColorAttachmentRef(1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL)
|
||||
.AddExternalSubpassDependency(
|
||||
VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
|
||||
VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
|
||||
|
|
@ -900,6 +928,8 @@ void VkLightmapper::CreateCopyPipeline()
|
|||
.AddFragmentShader(shaders.fragCopy)
|
||||
.Topology(VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP)
|
||||
.AddDynamicState(VK_DYNAMIC_STATE_VIEWPORT)
|
||||
.AddColorBlendAttachment(ColorBlendAttachmentBuilder().Create())
|
||||
.AddColorBlendAttachment(ColorBlendAttachmentBuilder().Create())
|
||||
.Viewport(0.0f, 0.0f, 0.0f, 0.0f)
|
||||
.Scissor(0, 0, 4096, 4096)
|
||||
.DebugName("copy.pipeline")
|
||||
|
|
|
|||
|
|
@ -95,10 +95,14 @@ struct CopyTileInfo
|
|||
int TileHeight;
|
||||
int Padding1;
|
||||
int Padding2;
|
||||
FVector3 WorldOrigin;
|
||||
float Padding3;
|
||||
FVector3 WorldU;
|
||||
float Padding4;
|
||||
FVector3 WorldV;
|
||||
float Padding5;
|
||||
};
|
||||
|
||||
static_assert(sizeof(CopyTileInfo) == sizeof(int32_t) * 8);
|
||||
|
||||
class VkLightmapper
|
||||
{
|
||||
public:
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue