Чтобы создать такой рисунок, я бы по-прежнему предлагал вам использовать шейдеры, но если нет, то есть еще много способов сделать это, но вам потребуется выполнить как минимум 2 вызова рисования.
Итак, лучший способ спросить меня - это нарисовать все эти рисунки только для альфа-канала. Это означает, что только альфа будет нарисована, пока цвета будут сохраняться, как есть. Для этого вам нужно сначала очистить альфа до нуля, поэтому при очистке буфера цвета убедитесь, что альфа-компонент установлен на ноль glClearColor(0,0,0,0)
должен сделать. Теперь, прежде чем вы перестанете рисовать, используйте цветную маску, чтобы включить только альфа: glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_TRUE)
. Теперь нарисуйте свои изображения, используя glBlendFuncSeparate(GL_ZERO, GL_ONE, GL_ONE, GL_ONE)
. Это означает игнорирование цвета вашей текстуры (часть RGB) и использование любого цвета в буфере ранее, и это означает использование альфы из текстуры и ее суммирование до того, что уже было в буфере (последнее значение имеет больше смысла должно быть GL_ZERO
, но это предотвратит совпадение). Теперь нарисуйте столько текстур, сколько хотите. У вас может быть только один, но он должен работать для любого числа из них.
Итак, в этот момент ваш буфер будет иметь альфа-нуль всюду, но где вы нарисовали свои текстуры, а текстуры имели ненулевую альфу. Так что пришло время нарисовать реальный цвет. Нам нужно снова установить цветную маску для рисования до цвета glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE)
(альфа-часть может быть установлена в значение false, но мы также сбросим ее). Теперь, чтобы нарисовать фактический цвет, нам нужно наложить части, имеющие альфа, поэтому давайте настроим смешение на glBlendFuncSeparate(GL_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA, GL_ONE, GL_ZERO)
. Это означает, что мы будем применять цвет в зависимости от текущего состояния альфа в буфере. Если в нем имеется 1, тогда будет применен полный цвет, если альфа будет 0, то тот же цвет останется таким, какой есть, если он будет смешивать цвет, который ранее был в буфере с новым цветом, что означает, что если у вас есть белый фон, вы можете очистить цвет до (1,1,1,0)
. Затем альфа будет переопределяться до того, что новая альфа будет установлена в цвет.
Теперь перерисуйте полноэкранный прямоугольник с отключенными текстурами и установите цвет, соответствующий цвету цели (фиолетовый), и все готово. Или вы можете перерисовывать прямоугольник (ы) только там, где были сделаны образы.
Нелегко?Как об этом:
- Установите чистый цвет на цвет ваших форм
glClearColor(violet.r, violet.g, violet.b, 0.0)
Держите альфа при нулевой
- Очистить цветовой буфер
- Набор цвета маски, чтобы привлечь к альфа только
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_TRUE)
- Включить наиболее Comon смешайте FUNC
glBlend(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
- Draw ваши текстуры, как вы бы любой другой
- Сбросить цвет маски по умолчанию
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE)
Примечание: Эта последняя процедура будет работать, только если смешение включено для вашего вида/экрана/холста. Если нет, тогда в большинстве случаев будет представлена только часть RGB, которая приведет к тому, что весь экран будет иметь сплошной цвет.
В GLSL это был бы простой фрагментный шейдер, в GL вам нужно сначала создать маску с вашего изображения (по своему усмотрению не с GL, который также прост вложен в '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' 'glColor' ... – Spektre
Кажется, излишним использовать Open Gl ES только для этого. Если вы не хотите менять цвет в каждом кадре, я бы рекомендовал загрузить изображение в объект Bitmap и использовать getPixels()/setPixels(), чтобы изменить его так, как вы хотите. В противном случае вам нужно будет написать фрагментарный шейдер для его обработки. –