java - iOS 上的 Libgdx 距离场字体支持

标签 java ios libgdx shader

使用距离场字体,如 Libgdx wiki 中所述:https://github.com/libgdx/libgdx/wiki/Distance-field-fonts 在 Android 上给出了良好的结果。我正在使用提供的示例着色器。

但是当我在 iOS 上运行相同的程序时,文本到处都被白色填充(见下图)。 iOS 不支持距离场吗?还是我需要添加/更改其他内容才能使其正常工作?

distance field problem

着色器代码font.vert:

uniform mat4 u_projTrans;

attribute vec4 a_position;
attribute vec2 a_texCoord0;
attribute vec4 a_color;

varying vec4 v_color;
varying vec2 v_texCoord;

void main() {
    gl_Position = u_projTrans * a_position;
    v_texCoord = a_texCoord0;
    v_color = a_color;
}

字体片段:

#ifdef GL_ES
    precision mediump float;
#endif

uniform sampler2D u_texture;

varying vec4 v_color;
varying vec2 v_texCoord;

const float smoothing = 1.0/16.0;

void main() {
    float distance = texture2D(u_texture, v_texCoord).a;
    float alpha = smoothstep(0.5 - smoothing, 0.5 + smoothing, distance);
    gl_FragColor = vec4(v_color.rgb, alpha);
}

像这样加载字体:

BitmapFont bf = new BitmapFont(Gdx.files.internal("fonts/mont-b.fnt"));
bf.getRegion().getTexture().setFilter(TextureFilter.MipMapLinearNearest, TextureFilter.Linear);

和着色器:

fontShader = new ShaderProgram(Gdx.files.internal("shader/font.vert"),     Gdx.files.internal("shader/font.frag"));

最佳答案

我认为问题可能是您没有在字体纹理上启用 mip 映射,因为您只是使用了没有 TextureRegion 参数的简单 BitmapFont 构造函数,因此它在假设没有 mip 映射的情况下加载纹理。

您必须像这样创建一个支持 mip 贴图的纹理,如 libgdx wiki 所示:

Texture texture = new Texture(Gdx.files.internal("yourFont.png"), true); //true to enable mip maps
texture.setFilter(TextureFilter.MipMapLinearNearest, TextureFilter.Linear);

然后您可以使用 mip 贴图纹理加载您的 BitmapFont,这样 BitmapFont 就不会创建自己没有 mip 贴图的纹理:

BitmapFont bf = new BitmapFont(Gdx.files.internal("fonts/mont-b.fnt"), new TextureRegion(texture));

关于java - iOS 上的 Libgdx 距离场字体支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27892283/

相关文章:

java - 如何使用 Google Distance Matrix API 返回 "Km"中的距离?

java - Android:如果有任何声音发生,听众记录声音

ios - 在 UITableView 中滚动时如何隐藏/显示图像?

ios - SceneKit – DAE模型的HitTest

iOS:如何检测Ipad是否放入特殊框架中

java - 在 LibGDX 中绘制文本

java - libGDX 中的 keyDown() 方法如何正常工作?

java - Java中父类数组可以保存子类对象吗?

java - 桥接另外两个静态物体的静态物体

java - libgdx 用户数据类