From e0897ae8b2b63ffc8203f9cea2f27cb391c57bd9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Lu=C3=ADs=20Vaz=20Silva?= Date: Thu, 15 May 2025 19:36:20 -0300 Subject: [PATCH] remove broken precise midtexture trace, fix sky tracing for actors --- .../rendering/hwrenderer/data/hw_cvars.cpp | 1 - .../rendering/hwrenderer/data/hw_cvars.h | 3 +- .../rendering/vulkan/shaders/vk_shader.cpp | 1 - .../rendering/vulkan/shaders/vk_shader.h | 6 +- .../rendering/vulkan/vk_renderstate.cpp | 2 - wadsrc/static/menudef.txt | 1 - wadsrc/static/shaders/scene/light_trace.glsl | 100 +++--------------- wadsrc/static/shaders/shaderkey.glsl | 2 +- 8 files changed, 19 insertions(+), 97 deletions(-) diff --git a/src/common/rendering/hwrenderer/data/hw_cvars.cpp b/src/common/rendering/hwrenderer/data/hw_cvars.cpp index 88a8d9ca3..e94f352e5 100644 --- a/src/common/rendering/hwrenderer/data/hw_cvars.cpp +++ b/src/common/rendering/hwrenderer/data/hw_cvars.cpp @@ -183,4 +183,3 @@ int get_gl_spritelight() CVARD(Bool, gl_fakemodellight, true, CVAR_GLOBALCONFIG | CVAR_ARCHIVE, "adds a fake sunlight on models to improve contrast") CVARD(Float, gl_fakemodellightintensity, 0.05, CVAR_GLOBALCONFIG | CVAR_ARCHIVE, "fake sunlight intensity (brightness)") -CVARD(Bool, gl_precise_midtextures_trace, false, CVAR_GLOBALCONFIG | CVAR_ARCHIVE, "trace midtextures facing towards camera, only needed for maps that don't use midtextures 'evenly', roughly doubles the cost of ray-traced lights") \ No newline at end of file diff --git a/src/common/rendering/hwrenderer/data/hw_cvars.h b/src/common/rendering/hwrenderer/data/hw_cvars.h index 11b5a2d90..38c36c57e 100644 --- a/src/common/rendering/hwrenderer/data/hw_cvars.h +++ b/src/common/rendering/hwrenderer/data/hw_cvars.h @@ -67,4 +67,5 @@ int get_gl_spritelight(); EXTERN_CVAR(Bool, gl_fakemodellight) EXTERN_CVAR(Float, gl_fakemodellightintensity) -EXTERN_CVAR(Bool, gl_precise_midtextures_trace) + + diff --git a/src/common/rendering/vulkan/shaders/vk_shader.cpp b/src/common/rendering/vulkan/shaders/vk_shader.cpp index a77ffa1a3..a8dcd9818 100644 --- a/src/common/rendering/vulkan/shaders/vk_shader.cpp +++ b/src/common/rendering/vulkan/shaders/vk_shader.cpp @@ -441,7 +441,6 @@ void VkShaderManager::BuildDefinesBlock(FString &definesBlock, const char *defin definesBlock << "#define USE_RAYTRACE ((uShaderKey1 & SK1_USE_RAYTRACE) != 0)\n"; definesBlock << "#define USE_RAYTRACE_PRECISE ((uShaderKey1 & SK1_USE_RAYTRACE_PRECISE) != 0)\n"; - definesBlock << "#define PRECISE_MIDTEXTURES ((uShaderKey1 & SK1_PRECISE_MIDTEXTURES) != 0)\n"; definesBlock << "#define SHADOWMAP_FILTER (SK_GET_SHADOWMAP_FILTER())\n"; diff --git a/src/common/rendering/vulkan/shaders/vk_shader.h b/src/common/rendering/vulkan/shaders/vk_shader.h index cf34d6770..f9a35b9cc 100644 --- a/src/common/rendering/vulkan/shaders/vk_shader.h +++ b/src/common/rendering/vulkan/shaders/vk_shader.h @@ -95,7 +95,7 @@ public: uint64_t UseShadowmap : 1; // USE_SHADOWMAP uint64_t UseRaytrace : 1; // USE_RAYTRACE uint64_t UseRaytracePrecise : 1; // USE_RAYTRACE_PRECISE - uint64_t PreciseMidtextureTrace : 1; // PRECISE_MIDTEXTURES + uint64_t Unused4 : 1; // formerly PRECISE_MIDTEXTURES uint64_t ShadowmapFilter : 4; // SHADOWMAP_FILTER uint64_t FogBeforeLights : 1; // FOG_BEFORE_LIGHTS uint64_t FogAfterLights : 1; // FOG_AFTER_LIGHTS @@ -105,12 +105,12 @@ public: uint64_t LightMode : 2; // LIGHTMODE_DEFAULT, LIGHTMODE_SOFTWARE, LIGHTMODE_VANILLA, LIGHTMODE_BUILD 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 Unused4: 1; + uint64_t Unused5: 1; uint64_t FogBalls : 1; // FOGBALLS uint64_t NoFragmentShader : 1; uint64_t DepthFadeThreshold : 1; uint64_t AlphaTestOnly : 1; // ALPHATEST_ONLY - uint64_t Unused5 : 1; + uint64_t Unused6 : 1; uint64_t LightNoNormals : 1; // LIGHT_NONORMALS uint64_t UseSpriteCenter : 1; // USE_SPRITE_CENTER uint64_t Unused : 26; diff --git a/src/common/rendering/vulkan/vk_renderstate.cpp b/src/common/rendering/vulkan/vk_renderstate.cpp index 85d479c1c..701e641c4 100644 --- a/src/common/rendering/vulkan/vk_renderstate.cpp +++ b/src/common/rendering/vulkan/vk_renderstate.cpp @@ -336,7 +336,6 @@ void VkRenderState::ApplyRenderPass(int dt) pipelineKey.ShaderKey.UseShadowmap = gl_light_shadows == 1; pipelineKey.ShaderKey.UseRaytrace = gl_light_shadows >= 2; pipelineKey.ShaderKey.UseRaytracePrecise = gl_light_shadows >= 3; - pipelineKey.ShaderKey.PreciseMidtextureTrace = gl_precise_midtextures_trace; pipelineKey.ShaderKey.ShadowmapFilter = std::clamp(int(gl_light_shadow_filter), 0, 15); pipelineKey.ShaderKey.Layout.GBufferPass = mRenderTarget.DrawBuffers > 1; @@ -1110,7 +1109,6 @@ void VkRenderState::ApplyLevelMeshPipeline(VulkanCommandBuffer* cmdbuffer, VkPip pipelineKey.ShaderKey.UseShadowmap = gl_light_shadows == 1; pipelineKey.ShaderKey.UseRaytrace = gl_light_shadows >= 2; pipelineKey.ShaderKey.UseRaytracePrecise = gl_light_shadows >= 3; - pipelineKey.ShaderKey.PreciseMidtextureTrace = gl_precise_midtextures_trace; pipelineKey.ShaderKey.ShadowmapFilter = std::clamp(int(gl_light_shadow_filter), 0, 15); pipelineKey.ShaderKey.Layout.GBufferPass = mRenderTarget.DrawBuffers > 1; diff --git a/wadsrc/static/menudef.txt b/wadsrc/static/menudef.txt index f360efd90..5200e81a3 100644 --- a/wadsrc/static/menudef.txt +++ b/wadsrc/static/menudef.txt @@ -1070,7 +1070,6 @@ OptionMenu "LightOptions" protected Option "$GLLIGHTMNU_LIGHTSHADOWS", gl_light_shadows, "ShadowMode" Option "$GLLIGHTMNU_LIGHTSHADOWFILTER", gl_light_shadow_filter, "ShadowFilter" Option "$GLLIGHTMNU_LIGHTSHADOWMAPQUALITY", gl_shadowmap_quality, "ShadowMapQuality" - Option "$GLLIGHTMNU_PRECISEMIDTEXTRACE", gl_precise_midtextures_trace, "YesNo" StaticText " " Option "$GLPREFMNU_SWLMBANDED", gl_bandedswlight, "OnOff" Option "$GLPREFMNU_FOGFORCEFULLBRIGHT", gl_brightfog, "YesNo" diff --git a/wadsrc/static/shaders/scene/light_trace.glsl b/wadsrc/static/shaders/scene/light_trace.glsl index 630879038..972dcab55 100644 --- a/wadsrc/static/shaders/scene/light_trace.glsl +++ b/wadsrc/static/shaders/scene/light_trace.glsl @@ -15,97 +15,23 @@ float TraceDynLightRay(vec3 origin, float tmin, vec3 direction, float dist) for (int i = 0; i < 3; i++) { - TraceResult result; - SurfaceInfo surface; - if (PRECISE_MIDTEXTURES) - { - bool skip = true; + TraceResult result = TraceFirstHit(origin, tmin, direction, dist); - { - TraceResult frontResult = TraceFirstHit(origin, tmin, direction, dist); - TraceResult backResult = TraceFirstHitReverse(origin, tmin, direction, dist); - - if(frontResult.primitiveIndex != -1 && backResult.primitiveIndex != -1) - { - //both hit - SurfaceInfo frontSurface = GetSurface(frontResult.primitiveIndex); - SurfaceInfo backSurface = GetSurface(backResult.primitiveIndex); - - bool frontFacing = TraceHitIsFacing(origin + direction * frontResult.t, frontSurface); - bool backFacing = TraceHitIsFacing(origin + direction * backResult.t, backSurface); + // Stop if we hit nothing - the point light is visible. + if (result.primitiveIndex == -1) + return alpha; - if(frontFacing && frontFacing == backFacing) - { - skip = false; - if(frontResult.t < backResult.t) - { - result = frontResult; - surface = frontSurface; - } - else - { - result = backResult; - surface = backSurface; - } - } - else if(backFacing) - { - skip = false; - result = backResult; - surface = backSurface; - } - else - { - skip = !frontFacing; - result = frontResult; - surface = frontSurface; - } - } - else if(frontResult.primitiveIndex != -1) - { - result = frontResult; - surface = GetSurface(frontResult.primitiveIndex); - skip = TraceHitIsFacing(origin + direction * result.t, surface); - } - else if(backResult.primitiveIndex != -1) - { - result = backResult; - surface = GetSurface(backResult.primitiveIndex); - skip = TraceHitIsFacing(origin + direction * result.t, surface); - } - else - { - // neither hit - return alpha; - } - } - - if(!skip) - { - alpha = PassRayThroughSurfaceDynLight(surface, GetSurfaceUV(result.primitiveIndex, result.primitiveWeights), alpha); - - // Stop if there is no light left - if (alpha <= 0.0) - return 0.0; - } - } - else - { - result = TraceFirstHit(origin, tmin, direction, dist); - - // Stop if we hit nothing - the point light is visible. - if (result.primitiveIndex == -1) - return alpha; - - surface = GetSurface(result.primitiveIndex); + SurfaceInfo surface = GetSurface(result.primitiveIndex); - // Pass through surface texture - alpha = PassRayThroughSurfaceDynLight(surface, GetSurfaceUV(result.primitiveIndex, result.primitiveWeights), alpha); + if (surface.Sky > 0.0) + return alpha; + + // Pass through surface texture + alpha = PassRayThroughSurfaceDynLight(surface, GetSurfaceUV(result.primitiveIndex, result.primitiveWeights), alpha); - // Stop if there is no light left - if (alpha <= 0.0) - return 0.0; - } + // Stop if there is no light left + if (alpha <= 0.0) + return 0.0; // Move to surface hit point origin += direction * result.t; diff --git a/wadsrc/static/shaders/shaderkey.glsl b/wadsrc/static/shaders/shaderkey.glsl index a7ed45b90..6a853f52a 100644 --- a/wadsrc/static/shaders/shaderkey.glsl +++ b/wadsrc/static/shaders/shaderkey.glsl @@ -20,7 +20,7 @@ #define SK1_USE_SHADOWMAP (1 << 12) #define SK1_USE_RAYTRACE (1 << 13) #define SK1_USE_RAYTRACE_PRECISE (1 << 14) -#define SK1_PRECISE_MIDTEXTURES (1 << 15) + #define SK1_SHADOWMAP_FILTER (15 << 16) #define SK1_FOG_BEFORE_LIGHTS (1 << 20) #define SK1_FOG_AFTER_LIGHTS (1 << 21)