2017-08-17 3 views
1

J'ai un programme où je dessine des lignes sur chaque image en utilisant ShapeRenderer. Sur chaque image je veux dessiner sur le précédent, fané d'un montant, cadre. Donc ce que je fais est d'abord dessiner un rectangle noir avec un alpha inférieur à 1, puis dessiner l'image en cours. Sur le bureau, il fonctionne bien et le résultat est quelque chose comme çaLibGdx `ShapeRenderer` sur Android n'honore pas canal alpha

enter image description here

Mais sur Android ne fonctionne pas. Cela rend comme ça.

enter image description here

I essayé permettant le mélange avant de tirer rectangle

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

également essayé seting le canal alpha 8 bits dans AndroidApplicationConfiguration (config.a = 8) Rien de ceux-ci travaille. Quoi d'autre puis-je essayer? Y a-t-il aussi un meilleur moyen de réaliser ce que je veux?

code écran

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

Est-ce que le format interne du tampon de dessin (ou frame buffer) possède un canal alpha (RGB au lieu de RGBA)? – Rabbid76

+0

@ Rabbid76 Comment puis-je voir ça? Ne devrait pas définir config.a = 8 résoudre ce problème? – alfoks

+1

Définissez les quatre couleurs de la configuration sur 8. Un téléphone ne prend en charge qu'un certain nombre de combinaisons. 5658 n'est certainement pas l'un d'entre eux, alors LibGDX doit choisir pour vous et cela pourrait être imprévisible. Ce n'est pas votre problème, cependant. – Tenfour04

Répondre

1

LibGDX utilise le double buffering sur Android, de sorte que votre technique ne fonctionnera pas. Dessinez dans un FrameBuffer pour vous assurer que votre dessin précédent n'est pas effacé toutes les autres images. Dessinez ensuite la texture de couleur du FrameBuffer sur l'écran de chaque image.

+0

Merci! J'essayais d'éviter cela, parce que j'ai lu quelque part que c'est cher, mais je vais essayer. – alfoks

+1

Lorsque vous dessinez le FrameBuffer à l'écran, assurez-vous que la fusion est désactivée. Ne devrait pas être un problème pour ce que vous faites. – Tenfour04