2017-08-17 11 views
1

私はShapeRendererを使って各フレームにいくつかの線を描いています。各フレームで、前のフレームの上に描きたい、額、フレームで色あせています。 私がやっていることは、まずアルファが1未満の黒い矩形を描き、現在のフレームを描画することです。デスクトップでそれがうまく機能し、その結果がこのAndroid上のLibGdx `ShapeRenderer`はアルファチャンネルを受け入れません

enter image description here

のようなものですが、Androidの上では動作しません。このようにレンダリングされます。私は矩形

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

を描画する前に混合を可能にする試み

enter image description here

はまた、これらの 何も働いていない(config.a = 8AndroidApplicationConfiguration 8ビットアルファチャンネルをSETING試みました。それ以外に何ができますか? また、私が望むものを達成するためのよりよい方法がありますか?

スクリーンコード

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(); 
     } 
    } 
} 
+0

描画バッファ(またはフレームバッファ)の内部フォーマットにはアルファチャンネル(RGBAではなくRGB)がありますか? – Rabbid76

+0

@ Rabbid76どうすればわかりますか? config.a = 8を設定してこの問題を解決してはいけませんか? – alfoks

+1

設定の4色すべてを8に設定します。電話機は、特定の組み合わせの組み合わせのみをサポートします。 5658はほとんど確かにそれらの1つではないので、LibGDXはあなたのために選ぶ必要があり、それは予測不可能なことがあります。しかし、それはあなたの問題ではありません。 – Tenfour04

答えて

1

LibGDXは、Android上でダブルバッファリングを使用していますので、あなたの技術は動作しません。 FrameBufferに描画すると、前の図面が他のすべてのフレームでクリアされないようにすることができます。次に、フレームごとにFrameBufferのカラーテクスチャをスクリーンに描画します。

+0

ありがとう!私はこれを避けようとしていました。なぜなら、どこか高価だと読んでいたからです。でも、試してみましょう。 – alfoks

+1

FrameBufferをスクリーンに描画するときは、ブレンドがオフになっていることを確認してください。あなたがしていることには問題ではありません。 – Tenfour04

関連する問題