着色器和制服。在Galaxy S6上表现不尽如人意

时间:2015-07-07 16:13:05

标签: android opengl-es shader fragment-shader mali

我有一个距离场着色器,用于LibGDX中的字体渲染。它需要一个统一的设置文本应该是多么大胆。所有这一切都已经很好地工作了很长时间,但是在最近一周似乎推出的Galaxy S6更新后的最后一周左右(我相信在美国),我有几个不正确的字体渲染报告。 (如果您有S6并希望看到问题,可以下载here

我的字体渲染涉及3次传递,一次用于投影,一次用于笔划,一次用于主文本。阴影和笔划比主文本绘制得更大(取决于字体设置)

我遇到的问题是S6似乎忽略了我更改制服以使文字不那么粗体,所以它将文字画得太粗,并将字母相互合并。 / p>

下面是一个错误和正确渲染的示例(此处没有投影)。

Example

该游戏已经推出超过一年,并安装在超过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();
}

0 个答案:

没有答案