transparent circle black around

让人想犯罪 __ 提交于 2019-12-02 05:58:59

问题


I'm trying to make transparent circle and everything around black with alpha. I'm using this code and it somehow doesn't work.

Gdx.gl.glEnable(GL20.GL_BLEND);
Gdx.gl.glBlendFunc(GL20.GL_DST_COLOR, GL20.GL_ZERO);
Gdx.gl.glBlendEquation(GL20.GL_FUNC_ADD);
shapeRenderer.begin(ShapeRenderer.ShapeType.Filled);
shapeRenderer.setColor(new Color(1, 1, 1, 1f));
shapeRenderer.circle(150,500,300);
shapeRenderer.end();
Gdx.gl.glDisable(GL20.GL_BLEND);

I want this:


回答1:


You can use FrameBuffer for your requirement.

public class GdxTest extends ApplicationAdapter implements InputProcessor {

    FrameBuffer frameBuffer;
    SpriteBatch spriteBatch;
    OrthographicCamera camera;

    Vector3 vector3;

    Texture texture,texture1;
    Sprite sprite;

    @Override
    public void create() {

        vector3=new Vector3();
        camera=new OrthographicCamera();
        camera.setToOrtho(false,Gdx.graphics.getWidth(),Gdx.graphics.getHeight());
        spriteBatch=new SpriteBatch();

        texture=new Texture("light.png");

        sprite=new Sprite(texture);
        sprite.setSize(150,150);
        texture1=new Texture("badlogic.jpg");

        Gdx.input.setInputProcessor(this);
    }

    @Override
    public void render() {

        frameBuffer.begin();

        Gdx.gl.glClearColor(.2f,.2f,.2f,1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

        spriteBatch.setProjectionMatrix(camera.combined);
        spriteBatch.setBlendFunction(GL20.GL_ONE,GL20.GL_ONE);
        spriteBatch.begin();
        sprite.draw(spriteBatch);
        spriteBatch.end();

        frameBuffer.end();

        spriteBatch.setBlendFunction(GL20.GL_SRC_ALPHA,GL20.GL_ONE_MINUS_SRC_ALPHA);
        spriteBatch.begin();

        spriteBatch.draw(texture1,100,100);
        spriteBatch.end();

        spriteBatch.setProjectionMatrix(spriteBatch.getProjectionMatrix().idt());

        spriteBatch.setBlendFunction( GL20.GL_ZERO,GL20.GL_SRC_COLOR);
        spriteBatch.begin();

        spriteBatch.draw(frameBuffer.getColorBufferTexture(),-1,1,2,-2);
        spriteBatch.end();
    }

    @Override
    public void resize(int width, int height) {

       if(frameBuffer !=null && (frameBuffer.getWidth()!=width || frameBuffer.getHeight()!=height )) {
           frameBuffer.dispose();
           frameBuffer=null;
       }

       if(frameBuffer==null){
           try {
               frameBuffer = new FrameBuffer(Pixmap.Format.RGBA8888, width, height, false);
           }catch (GdxRuntimeException e){
               frameBuffer=new FrameBuffer(Pixmap.Format.RGB565,width,height,false);
           }
       }
    }

    @Override
    public boolean keyDown(int keycode) {
        return false;
    }

    @Override
    public boolean keyUp(int keycode) {
        return false;
    }

    @Override
    public boolean keyTyped(char character) {
        return false;
    }

    @Override
    public boolean touchDown(int screenX, int screenY, int pointer, int button) {
        return false;
    }

    @Override
    public boolean touchUp(int screenX, int screenY, int pointer, int button) {
        return false;
    }

    @Override
    public boolean touchDragged(int screenX, int screenY, int pointer) {

        vector3.set(screenX,screenY,0);
        camera.unproject(vector3);
        sprite.setPosition(vector3.x-sprite.getWidth()/2,vector3.y-sprite.getHeight()/2);

        return false;
    }

    @Override
    public boolean mouseMoved(int screenX, int screenY) {
        return false;
    }

    @Override
    public boolean scrolled(int amount) {
        return false;
    }
}

Here is light.png

And my expected output :



来源:https://stackoverflow.com/questions/45595319/transparent-circle-black-around

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!