2014-12-22 24 views
5

Ich möchte glatten Text in meinem Spiel haben. Ich fand diese Lösung Pixel Shader, also mache ich alles, was auf github documentation beschrieben wird. Ich habe font.vert und font.frag Dateien und in dieser Dokumentation wird gesagt, dass ich Const Float Glättung = 0.25f/(Spread * Skala) verwenden sollte. Meine Schriftart hat eine Größe von 48 px, also verwende ich 0.25f/48.0f, aber meine Schriftart ist stille scharf und zerlumpt. Was mache ich falsch ?Wie Pixel Shader verwenden, um glatten Text zu erzielen?

dies 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); 
} 

ich alos linearen Filter für meine Schrift:

arial_white_48.getRegion().getTexture().setFilter(TextureFilter.Linear, TextureFilter.Linear); 

Text "Ihre Gäste" wird mit Pixel-Shader geschrieben und linearen Filter

Text "Highscore" wird nur mit linearem Filter geschrieben aber es ist stille

my text

+1

Es wäre hilfreich, Ihre Schriftart und das Endergebnis zu sehen. Können Sie einige Bilder hinzufügen? –

Antwort

1

Nun, es ist eine 8 Monate alte Frage, aber vielleicht sind Sie immer noch an der Antwort interessiert. Oder zumindest wird jemand mit dem gleichen Problem sein.

Um glatte Schriftarten zu haben, verwende ich freie Schriftarten, und ich erstelle sie in meinem Ladebildschirm. Dafür benötigen Sie einen Asset Manager.

Normalerweise schaffe ich meinen Asset Manager in meinem Haupt activty:

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(); 
    } 
} 

Und in dem Ladebildschirm erstelle ich die Schriften mit jeder Größe auf der Grundlage eine .ttf-Datei:

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); 
    } 

} 

Mit Mit dieser Methode können Sie sehr glatte Schriftarten beliebiger Größe erstellen. Der Trick ist, in diesen drei Linien sie glatt zu machen:

 size2Params.fontParameters.genMipMaps = true;     
     size2Params.fontParameters.minFilter = TextureFilter.Linear; 
     size2Params.fontParameters.magFilter = TextureFilter.Linear; 

Schließlich, wenn Sie benötigen einen Ihrer Schriftart zu verwenden, müssen Sie verwenden: mit dem Namen

game.assets.get("font1.ttf", BitmapFont.class) 

Seien Sie vorsichtig, deine Schriftarten Für die 2 Schriftarten, die ich in diesem Beispiel font1 und font2 erstellt habe, habe ich eine einzelne .ttf-Datei verwendet, die calibri.ttf ist, aber wenn ich die erstellten Schriftarten in meinem Code aufrufen, muss ich font1.ttf oder font2.ttf aufrufen, auch wenn es keine gibt .ttf-Dateien in meinem Asset.