2014-12-22 19 views
5

Voglio avere un testo scorrevole nel mio gioco. Ho trovato che la soluzione è pixel shader, quindi faccio tutto come è descritto su github documentation. Ho i file font.vert e font.frag e in questa documentazione si dice che dovrei usare const float smoothing = 0.25f/(spread * scale). Il mio font è di 48 px, quindi uso 0.25f/48.0f ma il mio font è stiloso e irregolare. Che cosa sto facendo di sbagliato ?Come utilizzare pixel shader per ottenere un testo uniforme?

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

ho alos utilizzare il filtro lineare per il mio carattere:

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

testo "il tuo punteggio" è scritto con pixel shader e filtro lineare

il testo "high score" è scritto solo con il filtro lineare ma è stil stilistico

my text

+1

Sarebbe utile vedere il tuo font e il risultato finale. Puoi aggiungere alcune immagini? –

risposta

1

Beh, è ​​una domanda di 8 mesi, ma forse siete ancora interessati alla risposta. O almeno qualcuno con lo stesso problema sarà.

Per avere caratteri uniformi, utilizzo font di tipo libero e li creo nella schermata di caricamento. Per questo è necessario un gestore patrimoniale.

solito Creo il mio asset manager nel mio activty principale:

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

E nella schermata di caricamento che creano i caratteri con qualsiasi dimensione, sulla base di un file .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 questo metodo è possibile creare caratteri molto lisci di qualsiasi dimensione. Il trucco per renderli lisci è in queste 3 linee:

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

Infine, quando è necessario utilizzare uno dei tuoi carattere, è necessario utilizzare:

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

Fate attenzione con il nome di i tuoi caratteri. Per i 2 caratteri che ho creato in questo esempio, e font2, ho utilizzato un singolo file .ttf che è calibri.ttf, ma quando chiamo i caratteri creati nel mio codice ho bisogno di chiamare font1.ttf o font2.ttf, anche se non ci sono File .ttf nella mia risorsa.