2014-06-21 71 views
1

當我使用ShapeRenderer時,它總是出現像素化。但如果我在photoshop中以相同的尺寸繪製圖形,則非常光滑,看起來很乾淨。ShapeRenderer使用LibGDX產生像素化形狀

我的方法就是如下:

package com.me.actors; 

import com.badlogic.gdx.Gdx; 
import com.badlogic.gdx.graphics.Color; 
import com.badlogic.gdx.graphics.Texture; 
import com.badlogic.gdx.graphics.g2d.Sprite; 
import com.badlogic.gdx.graphics.g2d.SpriteBatch; 
import com.badlogic.gdx.graphics.glutils.ShapeRenderer; 
import com.badlogic.gdx.graphics.glutils.ShapeRenderer.ShapeType; 
import com.badlogic.gdx.scenes.scene2d.Actor; 

public class bub_actors extends Actor { 
    private ShapeRenderer shapes; 
    private Texture text; 
    private Sprite sprite; 

    public bub_actors(){ 
     shapes = new ShapeRenderer(); 
     text = new Texture(Gdx.files.internal("data/circle.png")); 
     sprite = new Sprite(); 
     sprite.setRegion(text); 
    } 
    @Override 
    public void draw(SpriteBatch batch, float parentAlpha) { 
      batch.draw(sprite, 200, 200, 64, 64); 
      shapes.begin(ShapeType.FilledCircle); 
      shapes.filledCircle(50, 50, 32); 
      shapes.setColor(Color.BLACK); 
      shapes.end(); 
    } 
} 

下面是輸出的圖像:

enter image description here

任何想法,爲什麼出現這種情況?是否有可能使ShapeRenderer看起來像圖像(所以我不必創建不同顏色的圓形SpriteBatch ...)。

回答

3

區別在於Photoshop應用於其生成的圖像的anti-aliasing。如果放大兩個圓的邊緣,則會看到消除鋸齒的邊緣周圍有一些半黑色像素,其中ShapeRenderer生成的圓只是完全打開或關閉像素。

anti-aliased image

aliased image

的Libgdx ShapeRenderer被設計爲是一個快速和簡單的方式來獲得在屏幕上調試的形狀,它不支持抗鋸齒。獲得一致的反鋸齒渲染以使用紋理的最簡單方法。 (它也可以用OpenGL着色器。)

也就是說,你不必爲了呈現不同的彩色圓圈而創建不同的精靈。只需使用具有透明背景的白色圓圈,然後使用render it with a color即可。 (假設你想要各種各樣的純色圓圈)。

+0

謝謝!非常簡潔,易於理解。我沒有想過只是用一個白色圓圈來匹配我的背景,然後獨立地渲染裏面的顏色。再次感謝你的幫助! – user3340001

2

這裏是真正簡單的方法來實現光滑的&看起來不錯的形狀,而不使用紋理和SpriteBatch。

所有你需要做的就是渲染幾個稍大的圖形,以及更低的alpha通道和第一個通道。

越傳遞越好的結果,但當然,考慮你的屏幕的ppi。

... 
float alphaMultiplier = 0.5f; //you may play with different coefficients 
float radiusStep = radius/200; 
int sampleRate = 3; 
... 

//do not forget to enable blending 
Gdx.gl.glEnable(GL20.GL_BLEND); 
Gdx.gl.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA); 

shapeRenderer.begin(ShapeType.Filled); 

//first rendering 
shapeRenderer.setColor(r, g, b, a); 
shapeRenderer.circle(x, y, radius); 

//additional renderings 
for(int i=0; i<sampleRate; i++) { 
    a *= alphaMultiplier; 
    radius += radiusStep; 
    shapeRenderer.setColor(r, g, b, a); 
    shapeRenderer.circle(x, y, radius); 
} 

shapeRenderer.end(); 
... 

Here is a screenshot of what can you achieve.