Skip to content

Commit 3638d22

Browse files
committed
MSDF Pixel Range Fixes
1 parent fe51185 commit 3638d22

File tree

2 files changed

+10
-6
lines changed

2 files changed

+10
-6
lines changed

include/nbl/ext/TextRendering/TextRendering.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ class TextRenderer : public nbl::core::IReferenceCounted
3737
// Takes the CPUBuffer containing the image data in SNORM format and an offset into it
3838
uint32_t generateShapeMSDF(
3939
ICPUBuffer* buffer, uint32_t bufferOffset,
40-
msdfgen::Shape glyph, uint32_t msdfPixelRange, uint32_t2 msdfExtents,
40+
msdfgen::Shape glyph, uint32_t baseMSDFPixelRange, uint32_t2 msdfExtents,
4141
float32_t2 scale, float32_t2 translate);
4242

4343
TextRenderer()

src/nbl/ext/TextRendering/TextRendering.cpp

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,9 @@ uint32_t TextRenderer::generateShapeMSDF(
4444
auto shapeBounds = glyph.getBounds();
4545

4646
msdfgen::Bitmap<float, 4> msdfMap(msdfExtents.x, msdfExtents.y);
47-
48-
msdfgen::generateMTSDF(msdfMap, glyph, msdfPixelRange, { scale.x, scale.y }, { translate.x, translate.y });
47+
48+
double pxRange = (double)msdfPixelRange / (min(scale.x, scale.y));
49+
msdfgen::generateMTSDF(msdfMap, glyph, pxRange, { scale.x, scale.y }, { translate.x, translate.y });
4950

5051
for (int y = 0; y < msdfExtents.x; ++y)
5152
{
@@ -84,7 +85,7 @@ FontFace::GlyphMetrics FontFace::getGlyphMetrics(uint32_t glyphId)
8485
};
8586
}
8687

87-
core::smart_refctd_ptr<ICPUImage> FontFace::generateGlyphMSDF(uint32_t msdfPixelRange, uint32_t glyphId, uint32_t2 textureExtents, uint32_t mipLevels)
88+
core::smart_refctd_ptr<ICPUImage> FontFace::generateGlyphMSDF(uint32_t baseMSDFPixelRange, uint32_t glyphId, uint32_t2 textureExtents, uint32_t mipLevels)
8889
{
8990
ICPUImage::SCreationParams imgParams;
9091
{
@@ -136,7 +137,7 @@ core::smart_refctd_ptr<ICPUImage> FontFace::generateGlyphMSDF(uint32_t msdfPixel
136137
auto shapeBounds = shape.getBounds();
137138

138139
float32_t2 mipExtents = float32_t2(float(mipW), float(mipH));
139-
uint32_t mipPixelRange = msdfPixelRange / (1 << i);
140+
float32_t mipPixelRange = (float32_t)baseMSDFPixelRange / pow(2.0, double(i)); // TODO: Pixel range should be float
140141

141142
float32_t2 frameSize = float32_t2(
142143
(shapeBounds.r - shapeBounds.l),
@@ -155,7 +156,10 @@ core::smart_refctd_ptr<ICPUImage> FontFace::generateGlyphMSDF(uint32_t msdfPixel
155156
const float32_t2 shapeSpaceCenter = float32_t2(shapeBounds.l + shapeBounds.r, shapeBounds.t + shapeBounds.b) * float32_t2(0.5);
156157
const float32_t2 translate = mipExtents / (float32_t2(2.0) * uniformScale) - shapeSpaceCenter;
157158

158-
uint32_t result = m_textRenderer->generateShapeMSDF(buffer.get(), bufferOffset, shape, mipPixelRange, mipExtents, float32_t2(uniformScale, uniformScale), translate);
159+
// We are using `baseMSDFPixelRange`, because we still need larger range for smaller mips when aa feather is relatively large.
160+
// WARNING: HWTrilinear filtering will not give correct results.
161+
//because now the baseMSDFPixelRange is being used for all mips as it's wrong to mix/lerp values that have different scales (pixel ranges)
162+
uint32_t result = m_textRenderer->generateShapeMSDF(buffer.get(), bufferOffset, shape, baseMSDFPixelRange, mipExtents, float32_t2(uniformScale, uniformScale), translate);
159163
// Failing here means the buffer didn't have enough space
160164
assert(result);
161165
bufferOffset += result;

0 commit comments

Comments
 (0)