diff --git a/src/rendering/hwrenderer/scene/hw_viewpointuniforms.h b/src/rendering/hwrenderer/scene/hw_viewpointuniforms.h index c7e5475d4..1bd57faa0 100644 --- a/src/rendering/hwrenderer/scene/hw_viewpointuniforms.h +++ b/src/rendering/hwrenderer/scene/hw_viewpointuniforms.h @@ -18,8 +18,6 @@ struct HWViewpointUniforms float mClipHeightDirection = 0.f; int mShadowmapFilter = 1; - float timer = 0.0f; - void CalcDependencies() { mNormalViewMatrix.computeNormalMatrix(mViewMatrix); diff --git a/src/rendering/vulkan/renderer/vk_renderpass.cpp b/src/rendering/vulkan/renderer/vk_renderpass.cpp index 14c78eb18..18d095b08 100644 --- a/src/rendering/vulkan/renderer/vk_renderpass.cpp +++ b/src/rendering/vulkan/renderer/vk_renderpass.cpp @@ -89,8 +89,13 @@ int VkRenderPassManager::GetVertexFormat(int numBindingPoints, int numAttributes VkVertexFormat fmt; fmt.NumBindingPoints = numBindingPoints; fmt.Stride = stride; + fmt.UseVertexData = false; for (int j = 0; j < numAttributes; j++) + { + if (attrs[j].location == VATTR_COLOR) + fmt.UseVertexData = true; fmt.Attrs.push_back(attrs[j]); + } VertexFormats.push_back(fmt); return (int)VertexFormats.size() - 1; } diff --git a/src/rendering/vulkan/renderer/vk_renderpass.h b/src/rendering/vulkan/renderer/vk_renderpass.h index e19e82fff..429231bc8 100644 --- a/src/rendering/vulkan/renderer/vk_renderpass.h +++ b/src/rendering/vulkan/renderer/vk_renderpass.h @@ -47,6 +47,7 @@ public: int NumBindingPoints; size_t Stride; std::vector Attrs; + bool UseVertexData; }; class VkRenderPassManager diff --git a/src/rendering/vulkan/renderer/vk_renderstate.cpp b/src/rendering/vulkan/renderer/vk_renderstate.cpp index cf0322e88..7010249aa 100644 --- a/src/rendering/vulkan/renderer/vk_renderstate.cpp +++ b/src/rendering/vulkan/renderer/vk_renderstate.cpp @@ -62,6 +62,7 @@ bool VkRenderState::SetDepthClamp(bool on) void VkRenderState::SetDepthMask(bool on) { + mDepthWrite = on; } void VkRenderState::SetDepthFunc(int func) @@ -181,7 +182,6 @@ void VkRenderState::SetViewport(int x, int y, int w, int h) void VkRenderState::EnableDepthTest(bool on) { mDepthTest = on; - mDepthWrite = on; } void VkRenderState::EnableMultisampling(bool on) @@ -301,9 +301,6 @@ void VkRenderState::Apply(int dt) const float normScale = 1.0f / 255.0f; - //glVertexAttrib4fv(VATTR_COLOR, mColor.vec); - //glVertexAttrib4fv(VATTR_NORMAL, mNormal.vec); - int fogset = 0; if (mFogEnabled) @@ -329,7 +326,11 @@ void VkRenderState::Apply(int dt) mColors.uDynLightColor = mDynColor.vec; mColors.uInterpolationFactor = mInterpolationFactor; - //activeShader->muTimer.Set((double)(screen->FrameTime - firstFrame) * (double)mShaderTimer / 1000.); + mColors.useVertexData = passManager->VertexFormats[static_cast(mVertexBuffer)->VertexFormat].UseVertexData; + mColors.uVertexColor = mColor.vec; + mColors.uVertexNormal = mNormal.vec; + + mColors.timer = 0.0f; // static_cast((double)(screen->FrameTime - firstFrame) * (double)mShaderTimer / 1000.); int tempTM = TM_NORMAL; if (mMaterial.mMaterial && mMaterial.mMaterial->tex->isHardwareCanvas()) diff --git a/src/rendering/vulkan/shaders/vk_shader.cpp b/src/rendering/vulkan/shaders/vk_shader.cpp index dc6684cf3..512a2f0ec 100644 --- a/src/rendering/vulkan/shaders/vk_shader.cpp +++ b/src/rendering/vulkan/shaders/vk_shader.cpp @@ -95,8 +95,6 @@ static const char *shaderBindings = R"( float uClipHeight; float uClipHeightDirection; int uShadowmapFilter; - - float timer; // timer data for material shaders }; // light buffers @@ -119,7 +117,10 @@ static const char *shaderBindings = R"( vec4 uFogColor; float uDesaturationFactor; float uInterpolationFactor; - float padding0, padding1; + float timer; // timer data for material shaders + int useVertexData; + vec4 uVertexColor; + vec4 uVertexNormal; }; layout(set = 0, binding = 4, std140) uniform GlowingWallsUBO { @@ -182,6 +183,7 @@ static const char *shaderBindings = R"( // #define SUPPORTS_SHADOWMAPS #define VULKAN_COORDINATE_SYSTEM + #define HAS_UNIFORM_VERTEX_DATA )"; std::unique_ptr VkShaderManager::LoadVertShader(FString shadername, const char *vert_lump, const char *defines) diff --git a/src/rendering/vulkan/shaders/vk_shader.h b/src/rendering/vulkan/shaders/vk_shader.h index 9393996b1..8614fd3ae 100644 --- a/src/rendering/vulkan/shaders/vk_shader.h +++ b/src/rendering/vulkan/shaders/vk_shader.h @@ -27,7 +27,10 @@ struct ColorsUBO FVector4 uFogColor; float uDesaturationFactor; float uInterpolationFactor; - float padding0, padding1; + float timer; + int useVertexData; + FVector4 uVertexColor; + FVector4 uVertexNormal; }; struct GlowingWallsUBO diff --git a/src/rendering/vulkan/system/vk_builders.h b/src/rendering/vulkan/system/vk_builders.h index fb23fdceb..a538b2f6c 100644 --- a/src/rendering/vulkan/system/vk_builders.h +++ b/src/rendering/vulkan/system/vk_builders.h @@ -662,7 +662,7 @@ inline GraphicsPipelineBuilder::GraphicsPipelineBuilder() viewportState.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO; depthStencil.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO; - depthStencil.depthCompareOp = VK_COMPARE_OP_LESS; + depthStencil.depthCompareOp = VK_COMPARE_OP_LESS_OR_EQUAL; depthStencil.depthBoundsTestEnable = VK_FALSE; depthStencil.minDepthBounds = 0.0f; depthStencil.maxDepthBounds = 1.0f; diff --git a/wadsrc/static/shaders/glsl/main.vp b/wadsrc/static/shaders/glsl/main.vp index a27ae6381..b56a477d7 100644 --- a/wadsrc/static/shaders/glsl/main.vp +++ b/wadsrc/static/shaders/glsl/main.vp @@ -34,7 +34,14 @@ void main() vec4 eyeCoordPos = ViewMatrix * worldcoord; - vColor = aColor; + #ifdef HAS_UNIFORM_VERTEX_DATA + if (useVertexData == 0) + vColor = uVertexColor; + else + vColor = aColor; + #else + vColor = aColor; + #endif #ifndef SIMPLE pixelpos.xyz = worldcoord.xyz; @@ -64,7 +71,14 @@ void main() gl_ClipDistance[4] = worldcoord.y - ((uSplitBottomPlane.w + uSplitBottomPlane.x * worldcoord.x + uSplitBottomPlane.y * worldcoord.z) * uSplitBottomPlane.z); } - vWorldNormal = NormalModelMatrix * vec4(normalize(mix(aNormal.xyz, aNormal2.xyz, uInterpolationFactor)), 1.0); + #ifdef HAS_UNIFORM_VERTEX_DATA + if (useVertexData == 0) + vWorldNormal = NormalModelMatrix * vec4(uVertexNormal.xyz, 1.0); + else + vWorldNormal = NormalModelMatrix * vec4(normalize(mix(aNormal.xyz, aNormal2.xyz, uInterpolationFactor)), 1.0); + #else + vWorldNormal = NormalModelMatrix * vec4(normalize(mix(aNormal.xyz, aNormal2.xyz, uInterpolationFactor)), 1.0); + #endif vEyeNormal = NormalViewMatrix * vWorldNormal; #endif