Skip to content

Commit

Permalink
add portals/midtextures to ray-traced dynamic lights
Browse files Browse the repository at this point in the history
  • Loading branch information
RicardoLuis0 authored and dpjudas committed Dec 30, 2024
1 parent f0effac commit 728b6c0
Show file tree
Hide file tree
Showing 15 changed files with 168 additions and 178 deletions.
2 changes: 1 addition & 1 deletion src/common/rendering/hwrenderer/data/hw_cvars.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@ CVAR(Bool, gl_precache, true, CVAR_ARCHIVE)

CUSTOM_CVAR(Int, gl_light_shadows, 1, CVAR_ARCHIVE | CVAR_GLOBALCONFIG)
{
if (self < 0 || self > 3)
if (self < 0 || self > 4)
self = 1;
}

Expand Down
16 changes: 12 additions & 4 deletions src/common/rendering/vulkan/descriptorsets/vk_descriptorset.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -154,9 +154,14 @@ void VkDescriptorSetManager::UpdateFixedSet()
else
{
update.AddBuffer(Fixed.Set.get(), 5, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, fb->GetLevelMesh()->GetNodeBuffer());
update.AddBuffer(Fixed.Set.get(), 6, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, fb->GetLevelMesh()->GetVertexBuffer());
update.AddBuffer(Fixed.Set.get(), 7, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, fb->GetLevelMesh()->GetIndexBuffer());
}

update.AddBuffer(Fixed.Set.get(), 6, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, fb->GetLevelMesh()->GetVertexBuffer());
update.AddBuffer(Fixed.Set.get(), 7, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, fb->GetLevelMesh()->GetIndexBuffer());
update.AddBuffer(Fixed.Set.get(), 8, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, fb->GetLevelMesh()->GetSurfaceIndexBuffer());
update.AddBuffer(Fixed.Set.get(), 9, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, fb->GetLevelMesh()->GetSurfaceBuffer());
update.AddBuffer(Fixed.Set.get(), 10, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, fb->GetLevelMesh()->GetPortalBuffer());

update.Execute(fb->GetDevice());
}

Expand Down Expand Up @@ -280,9 +285,12 @@ void VkDescriptorSetManager::CreateFixedLayout()
else
{
builder.AddBinding(5, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT);
builder.AddBinding(6, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT);
builder.AddBinding(7, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT);
}
builder.AddBinding(6, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT);
builder.AddBinding(7, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT);
builder.AddBinding(8, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT);
builder.AddBinding(9, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT);
builder.AddBinding(10, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT);
builder.DebugName("VkDescriptorSetManager.Fixed.SetLayout");
Fixed.Layout = builder.Create(fb->GetDevice());
}
Expand Down
1 change: 1 addition & 0 deletions src/common/rendering/vulkan/shaders/vk_shader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -255,6 +255,7 @@ std::unique_ptr<VulkanShader> VkShaderManager::LoadFragShader(FString shadername
if (key.Glowmap) definesBlock << "#define TEXF_Glowmap\n";

if (key.UseRaytrace) definesBlock << "#define USE_RAYTRACE\n";
if (key.UseRaytracePrecise) definesBlock << "#define USE_RAYTRACE_PRECISE\n";
if (key.UseShadowmap) definesBlock << "#define USE_SHADOWMAP\n";
if (key.UseLevelMesh) definesBlock << "#define USE_LEVELMESH\n";

Expand Down
3 changes: 2 additions & 1 deletion src/common/rendering/vulkan/shaders/vk_shader.h
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,8 @@ class VkShaderKey
uint64_t AlphaTestOnly : 1; // ALPHATEST_ONLY
uint64_t LightBlendMode : 2; // LIGHT_BLEND_CLAMPED , LIGHT_BLEND_COLORED_CLAMP , LIGHT_BLEND_UNCLAMPED
uint64_t LightAttenuationMode : 1; // LIGHT_ATTENUATION_LINEAR , LIGHT_ATTENUATION_INVERSE_SQUARE
uint64_t Unused : 37;
uint64_t UseRaytracePrecise : 1; // USE_RAYTRACE_PRECISE
uint64_t Unused : 36;
};
uint64_t AsQWORD = 0;
};
Expand Down
6 changes: 4 additions & 2 deletions src/common/rendering/vulkan/vk_renderstate.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -303,7 +303,8 @@ void VkRenderState::ApplyRenderPass(int dt)
}

pipelineKey.ShaderKey.UseShadowmap = gl_light_shadows == 1;
pipelineKey.ShaderKey.UseRaytrace = gl_light_shadows == 2;
pipelineKey.ShaderKey.UseRaytrace = gl_light_shadows >= 2;
pipelineKey.ShaderKey.UseRaytracePrecise = gl_light_shadows >= 3;

pipelineKey.ShaderKey.GBufferPass = mRenderTarget.DrawBuffers > 1;

Expand Down Expand Up @@ -1066,7 +1067,8 @@ void VkRenderState::ApplyLevelMeshPipeline(VulkanCommandBuffer* cmdbuffer, VkPip
// Global state that don't require rebuilding the mesh
pipelineKey.ShaderKey.NoFragmentShader = noFragmentShader;
pipelineKey.ShaderKey.UseShadowmap = gl_light_shadows == 1;
pipelineKey.ShaderKey.UseRaytrace = gl_light_shadows == 2;
pipelineKey.ShaderKey.UseRaytrace = gl_light_shadows >= 2;
pipelineKey.ShaderKey.UseRaytracePrecise = gl_light_shadows >= 3;
pipelineKey.ShaderKey.GBufferPass = mRenderTarget.DrawBuffers > 1;

// State overridden by the renderstate drawing the mesh
Expand Down
2 changes: 1 addition & 1 deletion src/playsim/a_dynlight.h
Original file line number Diff line number Diff line change
Expand Up @@ -239,7 +239,7 @@ struct FDynamicLight
bool IsSpot() const { return !!((*pLightFlags) & LF_SPOT); }
bool IsAttenuated() const { return !!((*pLightFlags) & LF_ATTENUATE); }
bool Trace() const { return !!((*pLightFlags) & (LF_TRACE)); }
bool TraceActors() const { return Trace() || gl_light_shadows == 2; }
bool TraceActors() const { return Trace() || gl_light_shadows >= 2; }
bool DontShadowmap() const { return !!((*pLightFlags) & LF_NOSHADOWMAP); }
bool DontLightSelf() const { return !!((*pLightFlags) & (LF_DONTLIGHTSELF|LF_DONTLIGHTACTORS)); } // dontlightactors implies dontlightself.
bool DontLightActors() const { return !!((*pLightFlags) & LF_DONTLIGHTACTORS); }
Expand Down
1 change: 1 addition & 0 deletions wadsrc/static/menudef.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2715,6 +2715,7 @@ OptionValue ShadowMode
0, "$OPTVAL_NONE"
1, "$OPTVAL_SHADOWMAP"
2, "$OPTVAL_RAYTRACE"
3, "$OPTVAL_RAYTRACE_PRECISE"
}

OptionValue ShadowFilter
Expand Down
54 changes: 1 addition & 53 deletions wadsrc/static/shaders/lightmap/binding_lightmapper.glsl
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
#include <shaders/lightmap/binding_struct_definitions.glsl>

layout(set = 0, binding = 0) uniform readonly Uniforms
{
Expand All @@ -7,63 +8,10 @@ layout(set = 0, binding = 0) uniform readonly Uniforms
float SunIntensity;
};

struct SurfaceInfo
{
vec3 Normal;
float Sky;
uint PortalIndex;
int TextureIndex;
float Alpha;
float Padding0;
uint LightStart;
uint LightEnd;
uint Padding1;
uint Padding2;
};

struct PortalInfo
{
mat4 Transformation;
};

struct LightInfo
{
vec3 Origin;
float Padding0;
vec3 RelativeOrigin;
float Padding1;
float Radius;
float Intensity;
float InnerAngleCos;
float OuterAngleCos;
vec3 SpotDir;
float SoftShadowRadius;
vec3 Color;
float Padding3;
};

layout(set = 0, binding = 1) buffer readonly SurfaceIndexBuffer { uint surfaceIndices[]; };
layout(set = 0, binding = 2) buffer readonly SurfaceBuffer { SurfaceInfo surfaces[]; };
layout(set = 0, binding = 3) buffer readonly LightBuffer { LightInfo lights[]; };
layout(set = 0, binding = 4) buffer readonly LightIndexBuffer { int lightIndexes[]; };
layout(set = 0, binding = 5) buffer readonly PortalBuffer { PortalInfo portals[]; };

struct LightmapRaytracePC
{
int SurfaceIndex;
int Padding0;
int Padding1;
int Padding2;
vec3 WorldToLocal;
float TextureSize;
vec3 ProjLocalToU;
float Padding3;
vec3 ProjLocalToV;
float Padding4;
float TileX;
float TileY;
float TileWidth;
float TileHeight;
};

layout(std430, set = 0, binding = 6) buffer readonly ConstantsBuffer { LightmapRaytracePC constants[]; };
21 changes: 1 addition & 20 deletions wadsrc/static/shaders/lightmap/binding_raytrace.glsl
Original file line number Diff line number Diff line change
@@ -1,22 +1,11 @@
#include <shaders/lightmap/binding_struct_definitions.glsl>

#if defined(USE_RAYQUERY)

layout(set = 1, binding = 0) uniform accelerationStructureEXT acc;

#else

struct CollisionNode
{
vec3 center;
float padding1;
vec3 extents;
float padding2;
int left;
int right;
int element_index;
int padding3;
};

layout(std430, set = 1, binding = 0) buffer readonly NodeBuffer
{
int nodesRoot;
Expand All @@ -28,13 +17,5 @@ layout(std430, set = 1, binding = 0) buffer readonly NodeBuffer

#endif

struct SurfaceVertex // Note: this must always match the FFlatVertex struct
{
vec3 pos;
float lindex;
vec2 uv;
vec2 luv;
};

layout(std430, set = 1, binding = 1) buffer readonly VertexBuffer { SurfaceVertex vertices[]; };
layout(std430, set = 1, binding = 2) buffer readonly ElementBuffer { int elements[]; };
73 changes: 73 additions & 0 deletions wadsrc/static/shaders/lightmap/binding_struct_definitions.glsl
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@

struct SurfaceInfo
{
vec3 Normal;
float Sky;
uint PortalIndex;
int TextureIndex;
float Alpha;
float Padding0;
uint LightStart;
uint LightEnd;
uint Padding1;
uint Padding2;
};

struct PortalInfo
{
mat4 Transformation;
};

struct LightInfo
{
vec3 Origin;
float Padding0;
vec3 RelativeOrigin;
float Padding1;
float Radius;
float Intensity;
float InnerAngleCos;
float OuterAngleCos;
vec3 SpotDir;
float SoftShadowRadius;
vec3 Color;
float Padding3;
};

struct CollisionNode
{
vec3 center;
float padding1;
vec3 extents;
float padding2;
int left;
int right;
int element_index;
int padding3;
};

struct SurfaceVertex // Note: this must always match the FFlatVertex struct
{
vec3 pos;
float lindex;
vec2 uv;
vec2 luv;
};

struct LightmapRaytracePC
{
int SurfaceIndex;
int Padding0;
int Padding1;
int Padding2;
vec3 WorldToLocal;
float TextureSize;
vec3 ProjLocalToU;
float Padding3;
vec3 ProjLocalToV;
float Padding4;
float TileX;
float TileY;
float TileWidth;
float TileHeight;
};
56 changes: 1 addition & 55 deletions wadsrc/static/shaders/lightmap/binding_viewer.glsl
Original file line number Diff line number Diff line change
@@ -1,38 +1,4 @@

struct SurfaceInfo
{
vec3 Normal;
float Sky;
uint PortalIndex;
int TextureIndex;
float Alpha;
float Padding0;
uint LightStart;
uint LightEnd;
uint Padding1;
uint Padding2;
};

struct PortalInfo
{
mat4 Transformation;
};

struct LightInfo
{
vec3 Origin;
float Padding0;
vec3 RelativeOrigin;
float Padding1;
float Radius;
float Intensity;
float InnerAngleCos;
float OuterAngleCos;
vec3 SpotDir;
float SoftShadowRadius;
vec3 Color;
float Padding3;
};
#include <shaders/lightmap/binding_struct_definitions.glsl>

layout(set = 0, binding = 0, std430) buffer readonly SurfaceIndexBuffer { uint surfaceIndices[]; };
layout(set = 0, binding = 1, std430) buffer readonly SurfaceBuffer { SurfaceInfo surfaces[]; };
Expand All @@ -46,18 +12,6 @@ layout(set = 0, binding = 5) uniform accelerationStructureEXT acc;

#else

struct CollisionNode
{
vec3 center;
float padding1;
vec3 extents;
float padding2;
int left;
int right;
int element_index;
int padding3;
};

layout(set = 0, binding = 5, std430) buffer readonly NodeBuffer
{
int nodesRoot;
Expand All @@ -69,14 +23,6 @@ layout(set = 0, binding = 5, std430) buffer readonly NodeBuffer

#endif

struct SurfaceVertex // Note: this must always match the FFlatVertex struct
{
vec3 pos;
float lindex;
vec2 uv;
vec2 luv;
};

layout(set = 0, binding = 6, std430) buffer readonly VertexBuffer { SurfaceVertex vertices[]; };
layout(set = 0, binding = 7, std430) buffer readonly ElementBuffer { int elements[]; };

Expand Down
5 changes: 0 additions & 5 deletions wadsrc/static/shaders/lightmap/polyfill_rayquery.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -277,8 +277,3 @@ TraceResult TraceFirstHit(vec3 origin, float tmin, vec3 dir, float tmax)
}

#endif

bool traceHit(vec3 origin, vec3 direction, float dist)
{
return TraceAnyHit(origin, 0.01f, direction, dist);
}
15 changes: 15 additions & 0 deletions wadsrc/static/shaders/lightmap/trace_levelmesh.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,21 @@ vec3 PassRayThroughSurface(SurfaceInfo surface, vec2 uv, vec3 rayColor)
}
}

float PassRayThroughSurfaceDynLight(SurfaceInfo surface, vec2 uv, float rayAlpha)
{
if (surface.TextureIndex == 0)
{
return rayAlpha;
}
else
{
vec4 color = texture(textures[surface.TextureIndex], uv);

// Assume the renderstyle is basic alpha blend for now.
return rayAlpha * (1.0 - color.a * surface.Alpha);
}
}

void TransformRay(uint portalIndex, inout vec3 origin, inout vec3 dir)
{
mat4 transformationMatrix = portals[portalIndex].Transformation;
Expand Down
Loading

0 comments on commit 728b6c0

Please sign in to comment.