【发布时间】:2015-01-11 21:24:38
【问题描述】:
使用 Libgdx wiki 中解释的距离场字体:https://github.com/libgdx/libgdx/wiki/Distance-field-fonts 在android上给出了很好的结果。我正在使用提供的示例着色器。
但是当我在 iOS 上运行相同的程序时,文本到处都是白色(见下图)。 iOS 不支持距离字段还是我需要添加/更改其他内容才能使其正常工作?
着色器代码字体.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;
}
font.frag:
#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"));
【问题讨论】:
-
这看起来像是着色器中的错误导致它无法编译。有时,带有错误的着色器在某些设备上完全可以编译,因为它们对语法比 OpenGL ES 2.0 规范中描述的更宽松。请分享您的顶点和片段着色器代码。
-
我使用的代码与 wiki 上提供的完全相同:github.com/libgdx/libgdx/wiki/…
-
嗯,我看不出有什么问题。实例化 ShaderProgram 后,调用
Gdx.app.log("dist field shader", shaderProgram.getLog());以便查看它是否真的是着色器。这也可能是您加载纹理的方式。你能显示你的纹理加载代码吗? -
我目前无法测试,但我确实添加了字体加载(和着色器加载)代码