java - publicidad - ¿Cómo usar el sombreador de píxeles para lograr un texto suave?
pixel publicidad (1)
Quiero tener un texto suave en mi juego. Descubrí que la solución es el sombreador de píxeles, así que hago todo lo que se describe en la documentación de github . Tengo los archivos font.vert y font.frag y en esta documentación se dice que debería usar const float smoothing = 0.25f / (spread * scale). Mi fuente tiene un tamaño de 48 px, así que uso 0.25f / 48.0f pero mi fuente es muy nítida y desigual. Qué estoy haciendo mal ?
esto es font.frag:
#ifdef GL_ES
precision mediump float;
#endif
uniform sampler2D u_texture;
varying vec4 v_color;
varying vec2 v_texCoord;
const float smoothing = 0.25/48.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);
}
Yo también uso filtro lineal para mi fuente:
arial_white_48.getRegion().getTexture().setFilter(TextureFilter.Linear, TextureFilter.Linear);
el texto "su puntaje" está escrito con sombreador de píxeles y filtro lineal
El texto "puntaje alto" solo está escrito con filtro lineal, pero sigue siendo nítido
Bueno, es una pregunta de hace 8 meses, pero tal vez sigas interesado en la respuesta. O al menos alguien con el mismo problema será.
Para tener fuentes suaves, uso fuentes de tipo libre y las creo en la pantalla de carga. Para eso necesitas un administrador de activos.
Por lo general, creo mi administrador de activos en mi actividad principal:
public class MyGdxGame extends Game implements ApplicationListener {
public SpriteBatch batch;
public AssetManager assets;
@Override
public void create () {
batch = new SpriteBatch();
assets = new AssetManager();
this.setScreen(new LoadingScreen(this));
}
@Override
public void render () {
super.render();
}
}
Y en la pantalla de carga, creo las fuentes de cualquier tamaño, basadas en un archivo .ttf:
public class LoadingScreen implements Screen{
final MyGdxGame game;
public LoadingScreen(final MyGdxGame gam){
game = gam;
FileHandleResolver resolver = new InternalFileHandleResolver();
game.assets.setLoader(FreeTypeFontGenerator.class, new FreeTypeFontGeneratorLoader(resolver));
game.assets.setLoader(BitmapFont.class, ".ttf", new FreetypeFontLoader(resolver));
FreeTypeFontLoaderParameter size1Params = new FreeTypeFontLoaderParameter();
size1Params.fontFileName = "Fonts/calibri.ttf";
size1Params.fontParameters.genMipMaps = true;
size1Params.fontParameters.minFilter = TextureFilter.Linear;
size1Params.fontParameters.magFilter = TextureFilter.Linear;
size1Params.fontParameters.size = Gdx.graphics.getWidth()/18;
game.assets.load("font1.ttf", BitmapFont.class, size1Params);
FreeTypeFontLoaderParameter size2Params = new FreeTypeFontLoaderParameter();
size2Params.fontFileName = "Fonts/calibri.ttf";
size2Params.fontParameters.genMipMaps = true;
size2Params.fontParameters.minFilter = TextureFilter.Linear;
size2Params.fontParameters.magFilter = TextureFilter.Linear;
size2Params.fontParameters.size = Gdx.graphics.getWidth()/6;
game.assets.load("font2.ttf", BitmapFont.class, size2Params);
}
}
Con este método puedes crear fuentes muy suaves de cualquier tamaño. El truco para hacerlos suaves es en estas 3 líneas:
size2Params.fontParameters.genMipMaps = true;
size2Params.fontParameters.minFilter = TextureFilter.Linear;
size2Params.fontParameters.magFilter = TextureFilter.Linear;
Finalmente, cuando necesite usar una de sus fuentes, debe usar:
game.assets.get("font1.ttf", BitmapFont.class)
Ten cuidado con el nombre de tus fuentes. Para las 2 fuentes que creé en este ejemplo, font1
y font2
, utilicé un solo archivo .ttf que es calibri.ttf
, pero cuando llamo a las fuentes creadas en mi código, necesito llamar a font1.ttf
o font2.ttf
, incluso si no hay tales archivos .ttf en mi activo.