Вырезание одной фигуры из другой
Кратко: из одной геометрической фигуры необходимо вырезать другую геометрическую фигуру так, чтобы нарисованные ранее изображения остались прежними.
Подробно: используя libgdx и ShapeDrawer (ссылка на github), пытаюсь нарисовать некую геометрию.
SpriteBatch batch;
... // Инициализация SpriteBatch и тому подобное
ShapeDrawer drawer = new ShapeDrawer(batch, region);
...
batch.begin()
... // Здесь идёт отрисовка другой графики (на рисунке выше - "зелёный треугольник")
drawer.filledCircle(0, 0, 100); // "Красный круг" на рисунке
...
batch.end()
Необходимо из нарисованного круга (или сектора) вырезать следующую фигуру:
... // Здесь отрисовка "красного круга"
drawer.filledRectangle(25,25, 500, 400); // "Пунктирный прямоугольник" на рисунке
... // Здесь batch.end()
Начал копать в сторону блендинга OpenGL. Нашёл полезный сайтик, по нему определил необходимые (по моему мнению настройки). Получилось так:
...
batch.begin()
... // Здесь идёт отрисовка другой графики (на рисунке выше - "зелёный треугольник")
drawer.filledCircle(0, 0, 100); // "Красный круг" на рисунке
drawer.getBatch().enableBlending();
drawer.getBatch().setBlendFunction(GL_ZERO, GL_ONE_MINUS_SRC_ALPHA);
drawer.filledRectangle(25,25, 500, 400); // "Пунктирный прямоугольник" на рисунке
drawer.getBatch().disableBlending();
...
batch.end()
Проблема в том, что при таком подходе "зелёный треугольник" так же обрезается, чего не хотелось бы допустить. Да, проблема полностью исчезает, если поменять порядок отрисовки: сперва "красный круг", затем вырезать его с помощью "пунктирного прямоугольника", а после "зелёный треугольник". Тем не менее мне важно сохранить порядок "слоёв": "красный круг" должен перекрывать "зелёный треугольник" (или, по крайней мере, не перекрываться им).
Есть ли способ это сделать без применения велосипедов?
P.s. Также было бы интересно узнать, можно ли как-то "сохранить" рисуемое изображение (всё, что находится между batch.begin() и batch.end(), чтобы, например, не пересчитывать какие-то наложение и т.п.
По совету @Master Flomaster попробовал использовать FrameBuffer, однако столкнулся с проблемой наложения и, собственно, вырезания текстуры. В данный момент основные действующие объекты определены так (грубо говоря):
public class GameScreen{
ShapeDrawer drawer;
FrameBuffer fbo;
public GameScreen(){
fbo = new FrameBuffer(...);
drawer = new ShapeDrawer(batch, region); // Здесь batch - одно из полей супер-класса
}
...
public void render(){
batch.begin();
... // Отрисовка мира
fbo.begin();
... // Вот здесь располагается код из случая 1 и случая 2 (см. ниже)
fbo.end();
batch.end();
}
}
Случай 1: я пытаюсь использовать batch drawer-а. В таком случае всё, что находится перед командой drawer.getBatch().disableBlending(); не отрисовывается вообще.

// Код случая 1
fbo.begin();
drawer.setColor(0.85f,0.1f,0.1f,1f);
drawer.sector(0,0,(float) window_w/10,0, (float) (3.15/2));
//Разница только в коде ниже
drawer.getBatch().enableBlending();
drawer.getBatch().setBlendFunction(GL_ONE_MINUS_SRC_ALPHA, GL_ZERO);
drawer.setColor(0f,0f,0f,1f);
drawer.filledRectangle(25,25, 500, 400);
drawer.getBatch().disableBlending();
//Разница только в коде выше
drawer.setColor(0.1f,0.35f,0.85f,1f);
drawer.sector(window_w,0,(float) window_w/10,(float) (3.14/2), 3.15f);
drawer.setColor(0.6f,0.6f,0.6f, 1f);
drawer.rectangle(200, 0, 400, 50);
fbo.end();
Случай 2: я пытаюсь использовать команды Gdx.gl.*** . В таком случае наложение не работает совершенно.

// Код случая 2
fbo.begin();
drawer.setColor(0.85f,0.1f,0.1f,1f);
drawer.sector(0,0,(float) window_w/10,0, (float) (3.15/2));
//Разница только в коде ниже
Gdx.gl.glEnable(GL_BLEND);
Gdx.gl.glBlendFunc(GL_ZERO,GL_ONE_MINUS_SRC_ALPHA);
drawer.setColor(0f,0f,0f,1f);
drawer.filledRectangle(25,25, 500, 400);
Gdx.gl.glDisable(GL_BLEND);
//Разница только в коде выше
drawer.setColor(0.1f,0.35f,0.85f,1f);
drawer.sector(window_w,0,(float) window_w/10,(float) (3.14/2), 3.15f);
drawer.setColor(0.6f,0.6f,0.6f, 1f);
drawer.rectangle(200, 0, 400, 50);
fbo.end();
В чём моя ошибка?
Ответы (1 шт):
Как вариант можно отрендерить круг с прямоугольником во фрейм буффер. А потом наложить полученый результат на треугольник.
