Was ich eigentlich versuche zu erreichen: Ich möchte Text mit einer vertikalen Farbverlaufsfarbe zeichnen. Ich habe diese Lösung gefunden, aber sie passt nicht ganz zu mir, da sie in meinem Fall ein schwarzes Quadrat um die Verlaufsschrift hat - ich weiß nicht, wie ich sie loswerden soll, also habe ich eine einfache Frage (den irrelevanten Teil) gestellt Verstehe die Physik von Blending und Frame Buffer in opengl und libgdx besser
Was ich zu verstehen versuchte, ist für mein Ziel irrelevant: Ich habe eine Textur mit einem weißen Quadrat darauf, ich zeichne sie auf einen roten Hintergrund. Ich versuche, ein grünes Quadrat über das weiße zu zeichnen, das grüne Quadrat bedeckt teilweise das weiße und teilweise den roten Hintergrund (siehe Bild unten).
Meine Absicht ist: Der weiße Bereich, der sich hinter dem grünen Quadrat befindet, sollte in grüner Farbe gestrichen werden, aber der gesamte rote Hintergrund sollte nicht beeinträchtigt werden und unverändert bleiben (rot wie er ist).
Wie kann ich das machen?
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();
}
}
Idealerweise sollte das grüne Quadrat sowieso nicht transparent sein, sondern nur Weiß blockieren, wo es den weißen Bereich verbirgt.
Update : Ich markiere die Antwort von @Xoppa als richtig, da sie meine ursprüngliche Frage mit folgendem Ergebnis löst: