我有一个距离场着色器,用于LibGDX中的字体渲染。它需要一个统一的设置文本应该是多么大胆。所有这一切都已经很好地工作了很长时间,但是在最近一周似乎推出的Galaxy S6更新后的最后一周左右(我相信在美国),我有几个不正确的字体渲染报告。 (如果您有S6并希望看到问题,可以下载here)
我的字体渲染涉及3次传递,一次用于投影,一次用于笔划,一次用于主文本。阴影和笔划比主文本绘制得更大(取决于字体设置)
我遇到的问题是S6似乎忽略了我更改制服以使文字不那么粗体,所以它将文字画得太粗,并将字母相互合并。 / p>
下面是一个错误和正确渲染的示例(此处没有投影)。
该游戏已经推出超过一年,并安装在超过500k的设备上,这个问题才刚刚开始。
我没有一个有问题的S6来测试哪个让它变得棘手。这是我的字体渲染方法。
private GlyphLayout drawText(float x, float y, CharSequence str, float alignmentWidth, int alignment, boolean wrap, SpriteBatch drawBatch) {
if (dropShadowColour.a > 0) {
font.setColor(dropShadowColour.r, dropShadowColour.g, dropShadowColour.b, dropShadowColour.a * originalColour.a);
font.draw(drawBatch, str,
x + font.getCapHeight() * shadowOffset.x,
y + font.getCapHeight() * shadowOffset.y,
alignmentWidth, alignment, wrap);
font.setColor(originalColour);
}
if (strokeSize != 0) {
font.setColor(strokeColour);
font.draw(drawBatch, str, x, y, alignmentWidth, alignment, wrap);
drawBatch.flush();
drawBatch.getShader().setUniformf("u_boldness", 0);
}
font.setColor(originalColour);
return font.draw(drawBatch, str, x, y, alignmentWidth, alignment, wrap);
}
片段着色器
uniform sampler2D u_texture;
uniform float u_boldness;
uniform float u_smoothing;
varying vec4 v_color;
varying vec2 v_texCoord;
void main()
{
float distance = texture2D(u_texture, v_texCoord).b;
float alpha = smoothstep(0.5 - u_boldness - u_smoothing, 0.5 - u_boldness + u_smoothing, distance);
gl_FragColor = vec4(v_color.rgb * alpha, alpha * v_color.a);
}
在制作制服时我还有什么要做的吗?我预计不会开始和结束着色器吗?任何指针都会很有用。
更新如果我拨打drawBatch.end(); drawBatch.begin();
而不是drawBatch.flush();
,则问题就解决了。然而,这并不高效,所以我想要一个更好的解决方案。
另一次更新
我现在用它来解决这个问题
public static void safeFlush(SpriteBatch spriteBatch){
spriteBatch.flush();
spriteBatch.getShader().end();
spriteBatch.getShader().begin();
}