2014-12-22 34 views
5

Oyunumda düzgün metin olmasını istiyorum. Çözümün piksel gölgelendirici olduğunu buldum, bu yüzden github documentation'da açıklandığı gibi her şeyi yaparım. Font.vert ve font.frag dosyam var ve bu belgede const float smoothing = 0.25f/(spread * scale) kullanmam gerektiği söyleniyor. Yazı tipim 48 px büyüklüğündedir, bu yüzden 0.25f/48.0f kullanıyorum ama yazı tipim stil keskin ve düzensiz. Neyi yanlış yapıyorum ?Piksel gölgelendiriciyi düzgün metne nasıl sokarsınız?

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

Ben ALOS benim yazı tipi için doğrusal filtre kullanmak:

bu font.frag olduğunu

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

metin "puanınız" pixel shader ve lineer filtre ile yazılır

text "yüksek puan", yalnızca doğrusal filtre ile yazılmıştır, ancak vektör keskin

my text

+1

Yazı tipinizi ve sonuçlarınızı görmeniz yararlı olur. Bazı görüntüler ekleyebilir misiniz? –

cevap

1

Peki, bu 8 aylık bir soru, ama belki hala cevabınızla ilgileniyorsunuz. Ya da en azından aynı sorunu olan biri olacak.

Düz yazı tiplerine sahip olmak için, serbest yazı tiplerini kullanıyorum ve bunları yükleme ekranımda oluşturuyorum. Bunun için bir varlık yöneticisine ihtiyacınız var.

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

Ve yükleme ekranında bir Ttf dosyasına göre, herhangi bir boyut ile yazı oluşturun::

Genellikle benim ana etkinliğinizi benim varlık yöneticisi oluşturmak

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

} 

ile Bu yöntemde herhangi bir boyutta çok düzgün yazı tipi oluşturabilirsiniz. Onları düzgün hale getirmek için hüner bu 3 hatlarında geçerli:

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

Son olarak, yazı birini kullanmak gerektiğinde, kullanmak gerekir:

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

adıyla dikkatli olun yazı tiplerini Bu örnekte oluşturduğum 2 yazı için font1 ve font2, calibri.ttf olan tek bir .ttf dosyası kullandım, ancak kodumda oluşturulan yazı tiplerini çağırdığımda, böyle bir durum olmasa bile font1.ttf veya font2.ttf'u çağırmam gerekir. .ttf dosyaları varlığımda.