Java ShapeRenderer使用LibGDX生成像素化形状

Java ShapeRenderer使用LibGDX生成像素化形状,java,libgdx,Java,Libgdx,当我使用ShaperEnder时,它总是以像素显示。但如果我在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

当我使用ShaperEnder时,它总是以像素显示。但如果我在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();
    }
}
以下是输出的图像:

你知道为什么会这样吗?是否有可能使ShaperEnder看起来像图像(这样我就不必创建不同颜色圆圈的SpriteBatch…。

区别在于Photoshop应用于它生成的图像。如果放大两个圆的边缘,您将看到抗锯齿圆的边缘周围有一些半黑色像素,其中
shaperender
生成的圆仅显示完全打开或关闭的像素

Libgdx
shaperender
是一种在屏幕上快速、简单地获取调试形状的方法,它不支持抗锯齿。获得一致抗锯齿渲染的最简单方法是使用纹理。(也可以使用OpenGL着色器。)


也就是说,您不必创建不同的精灵来渲染不同颜色的圆。只需使用一个背景透明的白色圆圈,然后。(假设您需要各种纯色圆圈)。

这里有一种非常简单的方法,可以在不使用纹理和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();
...
。。。
浮点字母乘法器=0.5f//你可以使用不同的系数
浮动半径步长=半径/200;
int-sampleRate=3;
...
//不要忘记启用混合
Gdx.gl.glEnable(GL20.gl_混合物);
GL20.gl.glBlendFunc(GL20.gl_SRC_ALPHA,GL20.gl_ONE_减去SRC_ALPHA);
开始(ShapeType.Filled);
//首次渲染
设置颜色(r,g,b,a);
圆(x,y,半径);
//附加渲染

对于(int i=0;我感谢你!非常简洁易懂。我没有想到只使用一个白色圆圈来匹配我的背景,然后独立渲染内部颜色。再次感谢你的帮助!