2015-07-08 3 views
0

Я пытаюсь объединить два круга, один черный и другой белый. Части, где они пересекаются, должны быть серого. Я попытался использовать функции смешивания, но я не получаю ожидаемых результатов.Как смешивать два цвета текстур в Libgdx

Цель состоит в том, чтобы смешивать ТОЛЬКО эти два элемента, другие элементы (например, фон) не могут перемещаться там, и я не знаю, как это сделать, поддерживая 100% альфа-канала.

Это мой текущий код визуализации, circle1 и circle2 - TextureRegion.

public void draw(Batch batch, float parentAlpha) { 
    super.draw(batch, parentAlpha); 
    batch.enableBlending(); 
    batch.setBlendFunction(GL20.GL_ONE, GL20.GL_ONE); 

    batch.draw(circle1, c1.getX(), getY(), getWidth(), getHeight()); 
    batch.draw(circle2, c2.getX(), getY(), getWidth(), getHeight()); 

} 

Это пример цветовой смеси. blend example

EDIT: проблема решена. Я сделал тест с помощью SpriteBatch, я нарисовал третий круг с пониженной непрозрачностью, это код, который используется для тестирования и результат:

 Gdx.gl20.glEnable(GL20.GL_BLEND); 
     Gdx.gl20.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA); 
     shapeRenderer.setProjectionMatrix(camera.combined); 
     shapeRenderer.begin(ShapeRenderer.ShapeType.Filled); 
     shapeRenderer.setColor(1, 1, 1, 1f); 
     shapeRenderer.circle(15, 5, 5); 
     shapeRenderer.setColor(0, 0, 0, 1f); 
     shapeRenderer.circle(19, 5,5); 
     shapeRenderer.setColor(1, 1, 1, 0.5f); 
     shapeRenderer.circle(15, 5, 5); 
     shapeRenderer.end(); 
     Gdx.gl20.glDisable(GL20.GL_BLEND); 

solved problem

+1

Похоже, вы хотели другую смесь между верхней окружностью и нижней окружностью, чем у вас есть между верхней окружностью и фиолетовым фоном. Самый простой способ, который я могу придумать для этого, - снова нарисовать первый круг после второго круга, но с уменьшенной непрозрачностью. И сохраните функцию смешивания по умолчанию GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA. – Tenfour04

+0

Это решило мою проблему! Я отредактировал сообщение с помощью решения – Draelach

ответ

2

Я никогда не использовал libGDX поэтому я не знаю, как идет конкретная реализация, но я дам вам общее описание того, чего вы пытаетесь достичь.

Самое основное смешивание, которое вы можете достичь, представляет собой линейную смесь между двумя цветами с одним параметром t. Рассмотрим этот пример - скажем, каждый цвет представлен одним значением канала для простоты - черный - 0.0, а белый - 1.0. То, что вы хотите достичь, - это средний диапазон серого, равный 0,5, для этого вы будете смешать, масштабируя каждый канал соответствующим образом (черный * 0,5 + белый * 0,5 = 0,0 * 0,5 + 1,0 * 0,5 = 0,5)

Больше сложный способ смешивания цветов заключается в использовании альфа-канала источника для управления весом смеси, поэтому скажем, что у вас черный цвет и белый цвет с 0,4 альфа или непрозрачность. Вы будете смешивать, используя следующий метод: черный * 0,6 + белый * 0,4 (ваш альфа-сумма до 1,0), что даст вам 0,4 немного «темнее», чем серый серый.

Чтобы связать это с ответом на ваш вопрос, вы указываете метод смешивания как ОДИН, ОДИН, т. Е. Вы делаете черный * 1 + белый * 1, который должен привести к 1 (все белые).

Оглядываясь на документы для libGDX, у вас есть опция GL_ONE_MINUS_CONSTANT_ALPHA для постоянной весовой смеси, или если вы хотите сделать «альфа-смешение», вы можете перейти на GL_ALPHA, GL_ONE_MINUS_SRC_ALPHA.

Надеется, что это помогает и проясняет смешивания немного :)

+0

Thaks! Теперь я больше понимаю, как работает этот механизм смешивания :) – Draelach