diff --git a/src/common/rendering/hwrenderer/data/hw_renderstate.h b/src/common/rendering/hwrenderer/data/hw_renderstate.h index 0547e62e8..154c14ee1 100644 --- a/src/common/rendering/hwrenderer/data/hw_renderstate.h +++ b/src/common/rendering/hwrenderer/data/hw_renderstate.h @@ -200,7 +200,19 @@ struct StreamData FVector4 uDetailParms; FVector4 uNpotEmulation; - FVector4 padding1, padding2, padding3; + + FVector2 uClipSplit; + FVector2 uSpecularMaterial; + + float uLightLevel; + float uFogDensity; + float uLightFactor; + float uLightDist; + + float uAlphaThreshold; + float padding1; + float padding2; + float padding3; }; class FRenderState diff --git a/src/common/rendering/vulkan/shaders/vk_shader.h b/src/common/rendering/vulkan/shaders/vk_shader.h index 849c6e3cc..1a0dc4ee6 100644 --- a/src/common/rendering/vulkan/shaders/vk_shader.h +++ b/src/common/rendering/vulkan/shaders/vk_shader.h @@ -35,28 +35,10 @@ struct StreamUBO struct PushConstants { - int uTextureMode; - float uAlphaThreshold; - FVector2 uClipSplit; - - // Lighting + Fog - float uLightLevel; - float uFogDensity; - float uLightFactor; - float uLightDist; - int uFogEnabled; - - // dynamic lights - int uLightIndex; - - // Blinn glossiness and specular level - FVector2 uSpecularMaterial; - - // bone animation - int uBoneIndexBase; - - int uDataIndex; - int padding1, padding2, padding3; + int uDataIndex; // streamdata index + int uLightIndex; // dynamic lights + int uBoneIndexBase; // bone animation + int padding; }; class VkShaderKey diff --git a/src/common/rendering/vulkan/vk_renderstate.cpp b/src/common/rendering/vulkan/vk_renderstate.cpp index 77a6f48a7..ef5c7bbfd 100644 --- a/src/common/rendering/vulkan/vk_renderstate.cpp +++ b/src/common/rendering/vulkan/vk_renderstate.cpp @@ -395,6 +395,19 @@ void VkRenderState::ApplyStreamData() else mStreamData.timer = 0.0f; + mStreamData.uLightDist = mLightParms[0]; + mStreamData.uLightFactor = mLightParms[1]; + mStreamData.uFogDensity = mLightParms[2]; + mStreamData.uLightLevel = mLightParms[3]; + mStreamData.uAlphaThreshold = mAlphaThreshold; + mStreamData.uClipSplit = { mClipSplit[0], mClipSplit[1] }; + + if (mMaterial.mMaterial) + { + auto source = mMaterial.mMaterial->Source(); + mStreamData.uSpecularMaterial = { source->GetGlossiness(), source->GetSpecularLevel() }; + } + if (!mStreamBufferWriter.Write(mStreamData)) { WaitForStreamBuffers(); @@ -404,40 +417,9 @@ void VkRenderState::ApplyStreamData() void VkRenderState::ApplyPushConstants() { - int fogset = 0; - if (mFogEnabled) - { - if (mFogEnabled == 2) - { - fogset = -3; // 2D rendering with 'foggy' overlay. - } - else if ((GetFogColor() & 0xffffff) == 0) - { - fogset = gl_fogmode; - } - else - { - fogset = -gl_fogmode; - } - } - - mPushConstants.uFogEnabled = fogset; - mPushConstants.uLightDist = mLightParms[0]; - mPushConstants.uLightFactor = mLightParms[1]; - mPushConstants.uFogDensity = mLightParms[2]; - mPushConstants.uLightLevel = mLightParms[3]; - mPushConstants.uAlphaThreshold = mAlphaThreshold; - mPushConstants.uClipSplit = { mClipSplit[0], mClipSplit[1] }; - - if (mMaterial.mMaterial) - { - auto source = mMaterial.mMaterial->Source(); - mPushConstants.uSpecularMaterial = { source->GetGlossiness(), source->GetSpecularLevel() }; - } - + mPushConstants.uDataIndex = mStreamBufferWriter.DataIndex(); mPushConstants.uLightIndex = mLightIndex; mPushConstants.uBoneIndexBase = mBoneIndexBase; - mPushConstants.uDataIndex = mStreamBufferWriter.DataIndex(); auto passManager = fb->GetRenderPassManager(); mCommandBuffer->pushConstants(passManager->GetPipelineLayout(mPipelineKey.NumTextureLayers), VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, (uint32_t)sizeof(PushConstants), &mPushConstants); diff --git a/wadsrc/static/shaders/scene/frag_fogboundary.glsl b/wadsrc/static/shaders/scene/frag_fogboundary.glsl index 4332c8c93..ba8a06587 100644 --- a/wadsrc/static/shaders/scene/frag_fogboundary.glsl +++ b/wadsrc/static/shaders/scene/frag_fogboundary.glsl @@ -1,21 +1,17 @@ void main() { - float fogdist; - float fogfactor; - // // calculate fog factor // - if (uFogEnabled == -1) - { - fogdist = pixelpos.w; - } - else - { - fogdist = max(16.0, distance(pixelpos.xyz, uCameraPos.xyz)); - } - fogfactor = exp2 (uFogDensity * fogdist); + + #if defined(FOG_RADIAL) + float fogdist = max(16.0, distance(pixelpos.xyz, uCameraPos.xyz)); + #else + float fogdist = max(16.0, pixelpos.w); + #endif + float fogfactor = exp2 (uFogDensity * fogdist); + FragColor = vec4(uFogColor.rgb, 1.0 - fogfactor); #ifdef GBUFFER_PASS FragFog = vec4(0.0, 0.0, 0.0, 1.0); diff --git a/wadsrc/static/shaders/scene/layout_shared.glsl b/wadsrc/static/shaders/scene/layout_shared.glsl index 0a29c3d50..745b259a0 100644 --- a/wadsrc/static/shaders/scene/layout_shared.glsl +++ b/wadsrc/static/shaders/scene/layout_shared.glsl @@ -87,7 +87,19 @@ struct StreamData vec4 uDetailParms; vec4 uNpotEmulation; - vec4 padding1, padding2, padding3; + + vec2 uClipSplit; + vec2 uSpecularMaterial; + + float uLightLevel; + float uFogDensity; + float uLightFactor; + float uLightDist; + + float uAlphaThreshold; + float padding1; + float padding2; + float padding3; }; layout(set = 1, binding = 2, std140) uniform StreamUBO @@ -123,28 +135,10 @@ layout(set = 2, binding = 10) uniform sampler2D texture11; // This must match the PushConstants struct layout(push_constant) uniform PushConstants { - int padding0; // was uTextureMode; - float uAlphaThreshold; - vec2 uClipSplit; - - // Lighting + Fog - float uLightLevel; - float uFogDensity; - float uLightFactor; - float uLightDist; - int uFogEnabled; - - // dynamic lights - int uLightIndex; - - // Blinn glossiness and specular level - vec2 uSpecularMaterial; - - // bone animation - int uBoneIndexBase; - - int uDataIndex; - int padding2, padding3; + int uDataIndex; // streamdata index + int uLightIndex; // dynamic lights + int uBoneIndexBase; // bone animation + int padding; }; // material types @@ -192,6 +186,13 @@ layout(push_constant) uniform PushConstants #define uSplitBottomPlane data[uDataIndex].uSplitBottomPlane #define uDetailParms data[uDataIndex].uDetailParms #define uNpotEmulation data[uDataIndex].uNpotEmulation +#define uClipSplit data[uDataIndex].uClipSplit +#define uSpecularMaterial data[uDataIndex].uSpecularMaterial +#define uLightLevel data[uDataIndex].uLightLevel +#define uFogDensity data[uDataIndex].uFogDensity +#define uLightFactor data[uDataIndex].uLightFactor +#define uLightDist data[uDataIndex].uLightDist +#define uAlphaThreshold data[uDataIndex].uAlphaThreshold #define VULKAN_COORDINATE_SYSTEM #define HAS_UNIFORM_VERTEX_DATA