代码之家  ›  专栏  ›  技术社区  ›  alfoks

Android上的LibGdx“shaperender”不支持alpha频道

  •  1
  • alfoks  · 技术社区  · 7 年前

    ShapeRenderer . 在每一帧上,我想在上一帧的顶部绘制,褪色了一个数量,帧。 我要做的是先画一个alpha小于1的黑色矩形,然后画当前帧。在桌面上,它工作得很好,结果是这样的

    enter image description here

    enter image description here

    我尝试在绘制矩形之前启用混合

    Gdx.gl.glEnable(GL20.GL_BLEND);
    Gdx.gl.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA);
    

    AndroidApplicationConfiguration ( config.a = 8 ) 这些都不起作用。我还能试什么? 还有没有更好的方法来实现我想要的?

    屏幕代码

    package com.waterpaw.trochoids.screen;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import com.badlogic.gdx.Gdx;
    import com.badlogic.gdx.Input.Keys;
    import com.badlogic.gdx.graphics.GL20;
    import com.badlogic.gdx.graphics.glutils.ShapeRenderer;
    import com.badlogic.gdx.utils.viewport.ScreenViewport;
    import com.waterpaw.trochoids.Trochoid;
    import com.waterpaw.trochoids.Trochoids;
    
    public class GameScreen extends BaseScreen {
        private ShapeRenderer sr;
    
        private ScreenViewport viewport;
    
        private List<Trochoid> trochoids = new ArrayList<Trochoid>();
    
        public GameScreen(Trochoids game) {
            super(game);
    
            viewport = new ScreenViewport();
            Gdx.input.setInputProcessor(this);
            sr = new ShapeRenderer();
        }
    
        private int resized;
    
        @Override
        public void resize(int width, int height) {
            viewport.update(width, height);
    
            trochoids.clear();
            trochoids.add(new Trochoid(viewport.getWorldWidth(), viewport.getWorldHeight()));
            resized = 2;
        }
    
        @Override
        public void render(float delta) {
            if(resized-- > 0) {
                Gdx.gl.glClearColor(0f, 0f, 0f, 0f);
                Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
            }
            processInput();
    
            if(!trochoids.get(0).isPaused()) {
                updateTrochoids();
                renderTrochoids();
            }
        }
    
        private void processInput() {
            if(Gdx.input.isKeyJustPressed(Keys.P)) {
                if(trochoids.get(0).isPaused()) {
                    trochoids.get(0).unpause();
                } else {
                    trochoids.get(0).pause();
                }
            } else if(Gdx.input.isKeyJustPressed(Keys.SPACE)) {
                touchDown(0, 0, 0, 0);
            }
        }
    
        @Override
        public void dispose() {
            sr.dispose();
        }
    
        @Override
        public boolean touchDown(int x, int y, int pointer, int button) {
            trochoids.get(0).initialize();
            return true;
        }
    
        public void renderTrochoids() {
            sr.setProjectionMatrix(viewport.getCamera().combined);
    
            float w = viewport.getWorldWidth();
            float h = viewport.getWorldHeight();
            sr.setColor(0, 0, 0, 0.1f);
            sr.begin(ShapeRenderer.ShapeType.Filled);
            sr.rect(-w / 2, -h / 2, w, h);
            sr.end();
    
            sr.begin(ShapeRenderer.ShapeType.Line);
            for(int i = 0; i < trochoids.size(); i++) {
                trochoids.get(i).render(sr);
            }
            sr.end();
        }
    
        private void updateTrochoids() {
            for(int i = 0; i < trochoids.size(); i++) {
                trochoids.get(i).update();
            }
        }
    }
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Tenfour04    7 年前

    LibGDX在Android上使用双缓冲,所以你的技术不起作用。绘制到帧缓冲区,以便确保前一个图形不会每隔一帧清除一次。然后在每一帧的屏幕上绘制帧缓冲区的颜色纹理。