@@ -44,8 +44,9 @@ uint32_t TextRenderer::generateShapeMSDF(
44
44
auto shapeBounds = glyph.getBounds ();
45
45
46
46
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 });
49
50
50
51
for (int y = 0 ; y < msdfExtents.x ; ++y)
51
52
{
@@ -84,7 +85,7 @@ FontFace::GlyphMetrics FontFace::getGlyphMetrics(uint32_t glyphId)
84
85
};
85
86
}
86
87
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)
88
89
{
89
90
ICPUImage::SCreationParams imgParams;
90
91
{
@@ -136,7 +137,7 @@ core::smart_refctd_ptr<ICPUImage> FontFace::generateGlyphMSDF(uint32_t msdfPixel
136
137
auto shapeBounds = shape.getBounds ();
137
138
138
139
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
140
141
141
142
float32_t2 frameSize = float32_t2 (
142
143
(shapeBounds.r - shapeBounds.l ),
@@ -155,7 +156,10 @@ core::smart_refctd_ptr<ICPUImage> FontFace::generateGlyphMSDF(uint32_t msdfPixel
155
156
const float32_t2 shapeSpaceCenter = float32_t2 (shapeBounds.l + shapeBounds.r , shapeBounds.t + shapeBounds.b ) * float32_t2 (0.5 );
156
157
const float32_t2 translate = mipExtents / (float32_t2 (2.0 ) * uniformScale) - shapeSpaceCenter;
157
158
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);
159
163
// Failing here means the buffer didn't have enough space
160
164
assert (result);
161
165
bufferOffset += result;
0 commit comments