O que eu realmente tento alcançar: eu gostaria de desenhar texto com uma cor vertical degradê. Encontrei essa solução, mas ela não se encaixa bem, pois possui um quadrado preto em torno da fonte gradiente no meu caso - não sei como me livrar dela, então comecei uma pergunta simples (a parte irrelevante) a entender melhor a física da mistura e do buffer de quadros no opengl e libgdx
O que eu estava tentando entender, irrelevante para o meu objetivo: tenho uma textura com um quadrado branco, desenho em cima de fundo vermelho. Estou tentando desenhar um quadrado verde em cima do branco, o quadrado verde cobre parcialmente o branco e parcialmente em cima do fundo vermelho (veja a figura abaixo).
Minha intenção é: a área branca que fica atrás do quadrado verde deve ser pintada em verde, mas todo o fundo vermelho não deve ser afetado e permanecer inalterado (vermelho como é).
Como posso fazer isso?
package com.mygdx.game;
import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.glutils.ShapeRenderer;
public class Game extends ApplicationAdapter {
SpriteBatch batch;
Texture img;
private int height;
private int width;
private ShapeRenderer shapeRenderer;
@Override
public void create() {
batch = new SpriteBatch();
img = new Texture("white.png");
width = Gdx.graphics.getWidth();
height = Gdx.graphics.getHeight();
shapeRenderer = new ShapeRenderer();
shapeRenderer.setAutoShapeType(true);
}
@Override
public void render() {
Gdx.gl.glClearColor(1, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
batch.begin();
batch.draw(img, width / 7, height / 4);
batch.end();
Gdx.gl.glEnable(GL20.GL_BLEND);
Gdx.gl.glBlendFunc(GL20.GL_ONE, GL20.GL_SRC_COLOR);
shapeRenderer.begin();
shapeRenderer.set(ShapeRenderer.ShapeType.Filled);
shapeRenderer.setColor(Color.GREEN);
shapeRenderer.rect(width / 2 - 100, height / 4 - 50, 200, 200);
shapeRenderer.end();
Gdx.gl.glDisable(GL20.GL_BLEND);
}
@Override
public void dispose() {
batch.dispose();
img.dispose();
}
}
Idealmente, o quadrado verde não deve ser transparente, apenas deve bloquear o branco onde oculta a área branca.
Atualização : Marque a resposta do @Xoppa como correta, pois resolve minha pergunta original com o seguinte resultado: