From 94025c79c674aa9a9249c391641eedf1da0bdf0e Mon Sep 17 00:00:00 2001 From: Georg Hagen Date: Sat, 4 Jan 2025 02:46:24 +0100 Subject: [PATCH] Unify text shader handling --- examples/ExampleApps/TextExampleApp.cpp | 16 +++------- openVulkanoCpp/Scene/TextDrawable.cpp | 20 +++++++++--- openVulkanoCpp/Scene/TextDrawable.hpp | 9 ------ openVulkanoCpp/Shader/msdfText.frag | 9 ++---- openVulkanoCpp/Shader/sdfText.frag | 20 +++--------- openVulkanoCpp/Shader/sdfTextWithBorder.frag | 32 ++++++++++++++++++++ openVulkanoCpp/Shader/text.frag | 5 +-- 7 files changed, 60 insertions(+), 51 deletions(-) create mode 100644 openVulkanoCpp/Shader/sdfTextWithBorder.frag diff --git a/examples/ExampleApps/TextExampleApp.cpp b/examples/ExampleApps/TextExampleApp.cpp index 9ed0549..0ed5ca5 100644 --- a/examples/ExampleApps/TextExampleApp.cpp +++ b/examples/ExampleApps/TextExampleApp.cpp @@ -62,7 +62,6 @@ namespace OpenVulkano texts.push_back(std::make_pair("\u0410\u0411\u0412\u041F", TextConfig())); texts.push_back(std::make_pair("Unsupported glyphs \u1E30\u1E31 are coming", TextConfig())); texts.push_back(std::make_pair("This is first line\nSecond gg line\nThird G line", TextConfig())); - texts[0].second.applyBorder = true; texts[1].second.backgroundColor.a = 1; const int N = texts.size(); @@ -98,32 +97,27 @@ namespace OpenVulkano #if defined(MSDFGEN_AVAILABLE) && CREATE_NEW_ATLAS if (i < texts.size()) { - t = new TextDrawable(m_atlasGenerator.GetAtlasData(), texts[textIdx].second); - t->SetShader(&TextDrawable::GetSdfDefaultShader()); + t = new TextDrawable(m_atlasGenerator.GetAtlasData(), texts[textIdx].second); } else { - t = new TextDrawable(m_msdfAtlasGenerator.GetAtlasData(), texts[textIdx].second); - t->SetShader(&TextDrawable::GetMsdfDefaultShader()); + t = new TextDrawable(m_msdfAtlasGenerator.GetAtlasData(), texts[textIdx].second); } #else int xOffset = 0; if (i < N) { - t = new TextDrawable(sdfMetadataInfo, texts[textIdx].second); - t->SetShader(&TextDrawable::GetSdfDefaultShader()); + t = new TextDrawable(sdfMetadataInfo, texts[textIdx].second); xOffset = -5; } else if (i >= N && i < N * 2) { - t = new TextDrawable(msdfMetadataInfo, texts[textIdx].second); - t->SetShader(&TextDrawable::GetMsdfDefaultShader()); + t = new TextDrawable(msdfMetadataInfo, texts[textIdx].second); xOffset = 15; } else { - t = new TextDrawable(bitmapMetadataInfo, texts[textIdx].second); - t->SetShader(&TextDrawable::GetBitmapDefaultShader()); + t = new TextDrawable(bitmapMetadataInfo, texts[textIdx].second); xOffset = 35; } // OR use separate texture + metadata file diff --git a/openVulkanoCpp/Scene/TextDrawable.cpp b/openVulkanoCpp/Scene/TextDrawable.cpp index bbe5c1e..362f2c7 100644 --- a/openVulkanoCpp/Scene/TextDrawable.cpp +++ b/openVulkanoCpp/Scene/TextDrawable.cpp @@ -38,11 +38,11 @@ namespace OpenVulkano::Scene shader.cullMode = CullMode::NONE; return shader; } - } - Shader TextDrawable::DEFAULT_SHADER_BITMAP = MakeDefaultShader(FontAtlasType::BITMAP); - Shader TextDrawable::DEFAULT_SHADER_SDF = MakeDefaultShader(FontAtlasType::SDF); - Shader TextDrawable::DEFAULT_SHADER_MSDF = MakeDefaultShader(FontAtlasType::MSDF); + Shader DEFAULT_SHADER_BITMAP = MakeDefaultShader(FontAtlasType::BITMAP); + Shader DEFAULT_SHADER_SDF = MakeDefaultShader(FontAtlasType::SDF); + Shader DEFAULT_SHADER_MSDF = MakeDefaultShader(FontAtlasType::MSDF); + } TextDrawable::TextDrawable(const TextConfig& config) : m_cfg(config) { @@ -215,7 +215,17 @@ namespace OpenVulkano::Scene ++i; } m_bbox.Init(bmin, bmax); - SimpleDrawable::Init(nullptr, &m_geometry, &m_material, &m_uniBuffer); + + Shader* shader = nullptr; + switch (m_atlasData->meta.atlasType) + { + case FontAtlasType::SDF: shader = &DEFAULT_SHADER_SDF; break; + case FontAtlasType::MSDF: shader = &DEFAULT_SHADER_MSDF; break; + default: Logger::RENDER->warn("No default shader for atlas type: {}", m_atlasData->meta.atlasType.GetName()); + case FontAtlasType::BITMAP: shader = &DEFAULT_SHADER_BITMAP; break; + } + + SimpleDrawable::Init(shader, &m_geometry, &m_material, &m_uniBuffer); } void TextDrawable::SetAtlasData(const std::shared_ptr& atlasData) diff --git a/openVulkanoCpp/Scene/TextDrawable.hpp b/openVulkanoCpp/Scene/TextDrawable.hpp index 2554899..6e01092 100644 --- a/openVulkanoCpp/Scene/TextDrawable.hpp +++ b/openVulkanoCpp/Scene/TextDrawable.hpp @@ -21,19 +21,13 @@ namespace OpenVulkano::Scene struct TextConfig { Math::Vector4f textColor = { 1, 1, 1, 1 }; - Math::Vector4f borderColor = { 1, 0, 0, 1 }; Math::Vector4f backgroundColor = { 0, 1, 0, 0 }; float threshold = 0.4f; - float borderSize = 0.05f; float smoothing = 1.f/32.f; - uint32_t applyBorder = false; - //bool sdfMultiChannel = false; }; class TextDrawable : public SimpleDrawable { - static Shader DEFAULT_SHADER_BITMAP, DEFAULT_SHADER_SDF, DEFAULT_SHADER_MSDF; - Geometry m_geometry; Material m_material; UniformBuffer m_uniBuffer; @@ -45,9 +39,6 @@ namespace OpenVulkano::Scene uint32_t GetFallbackGlyph() const; public: - [[nodiscard]] static Shader& GetSdfDefaultShader() { return DEFAULT_SHADER_SDF; } - [[nodiscard]] static Shader& GetMsdfDefaultShader() { return DEFAULT_SHADER_MSDF; } - [[nodiscard]] static Shader& GetBitmapDefaultShader() { return DEFAULT_SHADER_BITMAP; } TextDrawable(const TextConfig& config = TextConfig()); TextDrawable(const Array& atlasMetadata, const TextConfig& config = TextConfig()); TextDrawable(const std::string& atlasMetadataFile, const TextConfig& config = TextConfig()); diff --git a/openVulkanoCpp/Shader/msdfText.frag b/openVulkanoCpp/Shader/msdfText.frag index 2878e2e..5bb8fd3 100644 --- a/openVulkanoCpp/Shader/msdfText.frag +++ b/openVulkanoCpp/Shader/msdfText.frag @@ -8,13 +8,10 @@ layout(set = 2, binding = 0) uniform sampler2D texSampler; layout(set = 3, binding = 0) uniform TextConfig { - vec4 textColor; - vec4 borderColor; - vec4 backgroundColor; - float threshold; - float borderSize; + vec4 textColor; + vec4 backgroundColor; + float threshold; float smoothing; - bool applyBorder; } textConfig; float median(float r, float g, float b) { diff --git a/openVulkanoCpp/Shader/sdfText.frag b/openVulkanoCpp/Shader/sdfText.frag index 579d9c7..49cc3ab 100644 --- a/openVulkanoCpp/Shader/sdfText.frag +++ b/openVulkanoCpp/Shader/sdfText.frag @@ -8,29 +8,17 @@ layout(set = 2, binding = 0) uniform sampler2D texSampler; layout(set = 3, binding = 0) uniform TextConfig { - vec4 textColor; - vec4 borderColor; - vec4 backgroundColor; - float threshold; - float borderSize; + vec4 textColor; + vec4 backgroundColor; + float threshold; float smoothing; - bool applyBorder; } textConfig; void main() { float distance = texture(texSampler, texCoord).r; float alpha = smoothstep(textConfig.threshold - textConfig.smoothing, textConfig.threshold + textConfig.smoothing, distance); - if (textConfig.applyBorder) - { - float border = smoothstep(textConfig.threshold + textConfig.borderSize - textConfig.smoothing, - textConfig.threshold + textConfig.borderSize + textConfig.smoothing, distance); - outColor = mix(textConfig.borderColor, textConfig.textColor, border) * alpha; - } - else - { - outColor = vec4(textConfig.textColor) * alpha; - } + outColor = vec4(textConfig.textColor) * alpha; if (textConfig.backgroundColor.a != 0) { diff --git a/openVulkanoCpp/Shader/sdfTextWithBorder.frag b/openVulkanoCpp/Shader/sdfTextWithBorder.frag new file mode 100644 index 0000000..6960a33 --- /dev/null +++ b/openVulkanoCpp/Shader/sdfTextWithBorder.frag @@ -0,0 +1,32 @@ +#version 450 + +layout(location = 1) in vec2 texCoord; + +layout(location = 0) out vec4 outColor; + +layout(set = 2, binding = 0) uniform sampler2D texSampler; + +layout(set = 3, binding = 0) uniform TextConfig +{ + vec4 textColor; + vec4 borderColor; + vec4 backgroundColor; + float threshold; + float borderSize; + float smoothing; +} textConfig; + +void main() +{ + float distance = texture(texSampler, texCoord).r; + float alpha = smoothstep(textConfig.threshold - textConfig.smoothing, textConfig.threshold + textConfig.smoothing, distance); + + float border = smoothstep(textConfig.threshold + textConfig.borderSize - textConfig.smoothing, + textConfig.threshold + textConfig.borderSize + textConfig.smoothing, distance); + outColor = mix(textConfig.borderColor, textConfig.textColor, border) * alpha; + + if (textConfig.backgroundColor.a != 0) + { + outColor = mix(textConfig.backgroundColor, outColor, alpha); + } +} diff --git a/openVulkanoCpp/Shader/text.frag b/openVulkanoCpp/Shader/text.frag index b906e40..460a50d 100644 --- a/openVulkanoCpp/Shader/text.frag +++ b/openVulkanoCpp/Shader/text.frag @@ -1,6 +1,6 @@ #version 450 -layout(location = 0) in vec4 color; +//layout(location = 0) in vec4 color; layout(location = 1) in vec2 texCoord; layout(location = 0) out vec4 outColor; @@ -10,12 +10,9 @@ layout(set = 2, binding = 0) uniform sampler2D texSampler; layout(set = 3, binding = 0) uniform TextConfig { vec4 textColor; - vec4 borderColor; vec4 backgroundColor; float threshold; - float borderSize; float smoothing; - bool applyBorder; } textConfig; void main()