Add SurfaceVertex to store texture UVs

This commit is contained in:
RaveYard 2023-09-20 12:51:11 +02:00 committed by Magnus Norddahl
commit 08b03f2d73
7 changed files with 146 additions and 15 deletions

View file

@ -8,9 +8,11 @@
#include "common/utility/matrix.h"
#include <memory>
#include <cstring>
#include "textureid.h"
#include <dp_rect_pack.h>
typedef dp::rect_pack::RectPacker<int> RectPacker;
class LevelMeshLight
@ -62,6 +64,8 @@ struct LevelMeshSurface
//
// Required for internal lightmapper:
//
FTextureID texture = FNullTextureID();
int portalIndex = 0;
int sectorGroup = 0;
@ -193,6 +197,7 @@ public:
virtual ~LevelMesh() = default;
TArray<FVector3> MeshVertices;
TArray<FVector2> MeshVertexUVs;
TArray<int> MeshUVIndex;
TArray<uint32_t> MeshElements;
TArray<int> MeshSurfaceIndexes;

View file

@ -412,6 +412,7 @@ void VkLightmap::CreateShaders()
{
std::string prefix = "#version 460\r\n";
std::string traceprefix = "#version 460\r\n";
traceprefix += "#extension GL_EXT_nonuniform_qualifier : enable\r\n";
if (useRayQuery)
{
traceprefix += "#extension GL_EXT_ray_query : require\r\n";
@ -484,6 +485,7 @@ void VkLightmap::CreateRaytracePipeline()
{
raytrace.descriptorSetLayout1 = DescriptorSetLayoutBuilder()
.AddBinding(0, VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, 1, VK_SHADER_STAGE_FRAGMENT_BIT)
.AddBinding(1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT)
.DebugName("raytrace.descriptorSetLayout1")
.Create(fb->GetDevice());
}
@ -528,7 +530,7 @@ void VkLightmap::CreateRaytracePipeline()
.RenderPass(raytrace.renderPass.get())
.AddVertexShader(shaders.vertRaytrace.get())
.AddFragmentShader(shaders.fragRaytrace.get())
.AddVertexBufferBinding(0, sizeof(FVector4))
.AddVertexBufferBinding(0, sizeof(SurfaceVertex))
.AddVertexAttribute(0, 0, VK_FORMAT_R32G32B32A32_SFLOAT, 0)
.Topology(VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST)
.AddDynamicState(VK_DYNAMIC_STATE_VIEWPORT)
@ -549,6 +551,7 @@ void VkLightmap::CreateRaytracePipeline()
{
raytrace.descriptorPool1 = DescriptorPoolBuilder()
.AddPoolSize(VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, 1)
.AddPoolSize(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1)
.MaxSets(1)
.DebugName("raytrace.descriptorPool1")
.Create(fb->GetDevice());
@ -575,6 +578,7 @@ void VkLightmap::UpdateAccelStructDescriptors()
{
WriteDescriptors()
.AddAccelerationStructure(raytrace.descriptorSet1.get(), 0, fb->GetRaytrace()->GetAccelStruct())
.AddBuffer(raytrace.descriptorSet1.get(), 1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, fb->GetRaytrace()->GetVertexBuffer())
.Execute(fb->GetDevice());
}
else

View file

@ -25,6 +25,8 @@
#include "vulkan/vk_renderdevice.h"
#include "vulkan/commands/vk_commandbuffer.h"
#include "hw_levelmesh.h"
#include "hw_material.h"
#include "texturemanager.h"
VkRaytrace::VkRaytrace(VulkanRenderDevice* fb) : fb(fb)
{
@ -42,6 +44,9 @@ VkRaytrace::VkRaytrace(VulkanRenderDevice* fb) : fb(fb)
NullMesh.MeshVertices.Push({ -1.0f, -1.0f, 1.0f });
NullMesh.MeshVertices.Push({ -1.0f, 1.0f, 1.0f });
NullMesh.MeshVertices.Push({ 1.0f, 1.0f, 1.0f });
NullMesh.MeshVertexUVs.Resize(NullMesh.MeshVertices.Size());
for (int i = 0; i < 3 * 4; i++)
NullMesh.MeshElements.Push(i);
@ -95,10 +100,11 @@ void VkRaytrace::CreateBuffers()
std::vector<CollisionNode> nodes = CreateCollisionNodes();
// std430 alignment rules forces us to convert the vec3 to a vec4
std::vector<FVector4> vertices;
std::vector<SurfaceVertex> vertices;
vertices.reserve(Mesh->MeshVertices.Size());
for (const FVector3& v : Mesh->MeshVertices)
vertices.push_back({ v, 1.0f });
for (int i = 0, count = Mesh->MeshVertices.Size(); i < count; ++i)
//vertices.push_back({ { Mesh->MeshVertices[i], 1.0f } });
vertices.push_back({ { Mesh->MeshVertices[i], 1.0f }, Mesh->MeshVertexUVs[i], float(i), i + 10000.0f});
CollisionNodeBufferHeader nodesHeader;
nodesHeader.root = Mesh->Collision->get_root();
@ -121,6 +127,13 @@ void VkRaytrace::CreateBuffers()
info.PortalIndex = surface->portalIndex;
info.SamplingDistance = (float)surface->sampleDimension;
info.Sky = surface->bSky;
if (surface->texture.isValid())
{
auto mat = FMaterial::ValidateTexture(TexMan.GetGameTexture(surface->texture), 0);
info.TextureIndex = fb->GetBindlessTextureIndex(mat, CLAMP_NONE, 0);
}
surfaceInfo.Push(info);
}
@ -132,7 +145,7 @@ void VkRaytrace::CreateBuffers()
VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT |
VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR : 0) |
VK_BUFFER_USAGE_STORAGE_BUFFER_BIT)
.Size(vertices.size() * sizeof(FVector4))
.Size(vertices.size() * sizeof(SurfaceVertex))
.DebugName("vertexBuffer")
.Create(fb->GetDevice());
@ -173,7 +186,7 @@ void VkRaytrace::CreateBuffers()
.Create(fb->GetDevice());
transferBuffer = BufferTransfer()
.AddBuffer(vertexBuffer.get(), vertices.data(), vertices.size() * sizeof(FVector4))
.AddBuffer(vertexBuffer.get(), vertices.data(), vertices.size() * sizeof(SurfaceVertex))
.AddBuffer(indexBuffer.get(), Mesh->MeshElements.Data(), (size_t)Mesh->MeshElements.Size() * sizeof(uint32_t))
.AddBuffer(nodesBuffer.get(), &nodesHeader, sizeof(CollisionNodeBufferHeader), nodes.data(), nodes.size() * sizeof(CollisionNode))
.AddBuffer(surfaceIndexBuffer.get(), Mesh->MeshSurfaceIndexes.Data(), Mesh->MeshSurfaceIndexes.Size() * sizeof(int))
@ -184,6 +197,11 @@ void VkRaytrace::CreateBuffers()
PipelineBarrier()
.AddMemory(VK_ACCESS_TRANSFER_WRITE_BIT, useRayQuery ? VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR : VK_ACCESS_SHADER_READ_BIT)
.Execute(fb->GetCommands()->GetTransferCommands(), VK_PIPELINE_STAGE_TRANSFER_BIT, useRayQuery ? VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR : VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT);
if(useRayQuery)
PipelineBarrier()
.AddMemory(VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_SHADER_READ_BIT)
.Execute(fb->GetCommands()->GetTransferCommands(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT);
}
void VkRaytrace::CreateBottomLevelAccelerationStructure()
@ -199,7 +217,7 @@ void VkRaytrace::CreateBottomLevelAccelerationStructure()
accelStructBLDesc.geometry.triangles = { VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_TRIANGLES_DATA_KHR };
accelStructBLDesc.geometry.triangles.vertexFormat = VK_FORMAT_R32G32B32A32_SFLOAT;
accelStructBLDesc.geometry.triangles.vertexData.deviceAddress = vertexBuffer->GetDeviceAddress();
accelStructBLDesc.geometry.triangles.vertexStride = sizeof(FVector4);
accelStructBLDesc.geometry.triangles.vertexStride = sizeof(SurfaceVertex);
accelStructBLDesc.geometry.triangles.indexType = VK_INDEX_TYPE_UINT32;
accelStructBLDesc.geometry.triangles.indexData.deviceAddress = indexBuffer->GetDeviceAddress();
accelStructBLDesc.geometry.triangles.maxVertex = Mesh->MeshVertices.Size() - 1;

View file

@ -33,6 +33,14 @@ struct SurfaceInfo
float Sky;
float SamplingDistance;
uint32_t PortalIndex;
int32_t TextureIndex;
float Padding;
};
struct SurfaceVertex
{
FVector4 pos;
FVector2 uv;
float Padding1, Padding2;
};