当我使用ShapeRenderer时,它总是出现像素化。但如果我在相同尺寸的Photoshop中绘制形状,它会非常光滑和干净。
我的方法如下:
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();
}
}
这是输出图像:
关于为什么会发生这种情况的任何想法?是否可以使ShapeRenderer看起来像图像(因此我不必创建不同颜色的圆圈的SpriteBatch ......)。
答案 0 :(得分:4)
Photoshop应用于其生成的图像的差异为anti-aliasing。如果放大两个圆的边缘,您将看到消除锯齿的边缘周围有一些半黑色像素,ShapeRenderer
生成的圆圈只显示完全打开或关闭的像素。
Libgdx ShapeRenderer
旨在成为在屏幕上调试形状的快速简单方法,它不支持抗锯齿。获得一致抗锯齿渲染的最简单方法是使用纹理。 (也可以使用OpenGL着色器。)
也就是说,您不必创建不同的精灵只是为了渲染不同的彩色圆圈。只需使用带有透明背景的白色圆圈,然后render it with a color。 (假设你想要各种纯色圆圈)。
答案 1 :(得分:4)
这是实现顺畅和简单的简单方法不使用纹理和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();
...