Android上的LibGdx` ShapeRenderer`不支持alpha通道

时间:2017-08-17 11:15:31

标签: android opengl-es libgdx

我有一个程序,我使用ShapeRenderer在每个帧上绘制一些线条。在每一帧上,我想在前一个上面绘制,以一定数量的帧褪色。 所以我要做的是先绘制一个小于1的alpha矩形,然后绘制当前帧。在桌面上它运行良好,结果是这样的

enter image description here

但是在Android上它不起作用。它就像这样呈现。

enter image description here

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

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

还尝试在AndroidApplicationConfigurationconfig.a = 8)中将alpha通道设置为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 个答案:

答案 0 :(得分:1)

LibGDX在Android上使用双缓冲,因此您的技术无效。绘制到FrameBuffer,以确保不会每隔一帧清除以前的绘图。然后在每帧上将FrameBuffer的颜色纹理绘制到屏幕上。