libgdx - libgdx 中的距离场字体

标签 libgdx

我正在尝试渲染平滑的可缩放位图字体。检查后question answers之一提到使用距离场字体。

我正在按照 LibGDX wiki article 中提到的方式进行操作关于距离场字体。但是我无法让它工作。字体变得模糊。

example preview

这是我用来生成此输出的代码

public class FontRenderTest implements ApplicationListener {
private Texture texture;
private SpriteBatch spriteBatch;
private BitmapFont font;

@Override
public void create() {
    spriteBatch = new SpriteBatch();

    Texture texture = new Texture(Gdx.files.internal("Raleway.png"), true); // true enables mipmaps
    texture.setFilter(TextureFilter.MipMapLinearNearest, TextureFilter.Linear); // linear filtering in nearest mipmap image

    font = new BitmapFont(Gdx.files.internal("Raleway.fnt"), new TextureRegion(texture), false);
}


@Override
public void render() {
    Gdx.gl.glClearColor(0, 0, 0, 1);
    Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);

    spriteBatch.begin();
    font.draw(spriteBatch, "This is hazy !!", 100, 150);
    spriteBatch.end();

}
}

我不确定我是否正确理解了距离场字体的功能。如果有人可以解释如何使字体平滑。

最佳答案

我认为它需要一个着色器,如果我没记错的话,着色器需要 GL20。正如 wiki 中所说,您需要 .frag 和 .vert 文件。我在 Libgdx 测试的帮助下修改了您的代码:http://git.io/-yAmNg .

It looks like this with different smoothing.

它看起来像这样,具有不同的平滑效果。

public class FontRenderTest implements ApplicationListener {                                                                
private Texture texture;                                                                                                    
private SpriteBatch spriteBatch;                                                                                            
private BitmapFont font;                                                                                                    
private DistanceFieldShader distanceFieldShader;                                                                            
private static class DistanceFieldShader extends ShaderProgram {                                                            
    public DistanceFieldShader () {                                                                                         
        // The vert and frag files are copied from http://git.io/yK63lQ (vert) and http://git.io/hAcw9Q (the frag)          
        super(Gdx.files.internal("data/shaders/distancefield.vert"), Gdx.files.internal("data/shaders/distancefield.frag"));
        if (!isCompiled()) {                                                                                                
            throw new RuntimeException("Shader compilation failed:\n" + getLog());                                          
        }                                                                                                                   
    }                                                                                                                       

    /** @param smoothing a value between 0 and 1 */                                                                         
    public void setSmoothing (float smoothing) {                                                                            
        float delta = 0.5f * MathUtils.clamp(smoothing, 0, 1);                                                              
        setUniformf("u_lower", 0.5f - delta);                                                                               
        setUniformf("u_upper", 0.5f + delta);                                                                               
    }                                                                                                                       
}                                                                                                                           
    @Override                                                                                                                   
    public void create() {                                                                                                      
        spriteBatch = new SpriteBatch();                                                                                        

        Texture texture = new Texture(Gdx.files.internal("hiero.png"), true); // true enables mipmaps                           
        texture.setFilter(TextureFilter.MipMapLinearNearest, TextureFilter.Linear); // linear filtering in nearest mipmap image 

        font = new BitmapFont(Gdx.files.internal("hiero.fnt"), new TextureRegion(texture), false);                              
        distanceFieldShader = new DistanceFieldShader();                                                                        
    }
       @Override                                                                             
   public void render() {                                                                
       Gdx.gl.glClearColor(0, 0, 0, 1);                                                  
       Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);                                         

       spriteBatch.begin();                                                              

       spriteBatch.setShader(distanceFieldShader);                                       
       font.draw(spriteBatch, "This is pretty sharp !!", 100, 120);                      
       distanceFieldShader.setSmoothing(0f);                                             

       spriteBatch.setShader(distanceFieldShader);                                       
       font.draw(spriteBatch, "This is hazy !!", 100, 150);                              
       distanceFieldShader.setSmoothing(1f);                                             

       spriteBatch.setShader(distanceFieldShader);                                       
       font.draw(spriteBatch, "This is pretty smooth !!", 100, 180);                     
       distanceFieldShader.setSmoothing(1/2f);                                           

       spriteBatch.end();                                                                

   }

关于libgdx - libgdx 中的距离场字体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24351645/

相关文章:

android - 是否可以使用 JSON 在 LibGDX 的 TextButtonStyle 中使用两种字体?

libgdx - 在 LibGdx 中管理位图字体资源

android - 在三星 galaxy y (s5360) 上加载纹理

box2d - 当 body 开始与地面接触时,如何改变 body 的摩擦力?

java - 使用 libGDX 绘制填充的多边形

java - Libgdx 和服务器游戏

java - 如何将一个存储为java对象的对象的变量传递给另一个也存储为java对象的对象的函数?

java - 无法加载平铺 map (Libgdx)

java - LibGDX FrameBuffer 缩放

java - Gdx.files.internal 不会工作(blueJ)