Lo que realmente intento lograr: me gustaría dibujar texto con un color vertical degradado. Encontré esta solución, pero no me queda del todo, ya que en mi caso tiene un cuadrado negro alrededor de la fuente de degradado; no sé cómo deshacerme de ella, así que comencé una pregunta simple (la parte irrelevante) para Comprender mejor la física de la mezcla y el búfer de trama en opengl y libgdx
Lo que estaba tratando de entender, irrelevante para mi objetivo: tengo una textura con un cuadrado blanco, lo dibujo sobre un fondo rojo. Estoy tratando de dibujar un cuadrado verde sobre el blanco, el cuadrado verde cubre parcialmente el blanco y parcialmente sobre el fondo rojo (vea la imagen a continuación).
Mi intención es: el área blanca, que está detrás del cuadrado verde, debe pintarse en color verde, pero todo el fondo rojo no debe verse afectado y permanecer sin cambios (rojo como está).
¿Cómo puedo hacer esto?
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, el cuadrado verde no debería ser transparente de todos modos, solo debería bloquear el blanco donde oculta el área blanca.
La salida que estoy obteniendo:
Actualización : Marco la respuesta de @Xoppa como correcta, ya que resuelve mi pregunta original con el siguiente resultado: