2016-10-24 4 views
-1

У меня есть картина, как Источник:Твердые раскрасить видимые пиксели изображения

img.

Моя цель состоит в том, чтобы показать его как результат:

img.

Цвет должен быть переменным.

Возможно ли это, используя glEnable/glBlendFunc/glBlendFuncSeparate/glBlendEquationSeparate?

Или мне нужно использовать шейдер (glsl)? Как будет выглядеть этот шейдер?

+0

В GLSL это был бы простой фрагментный шейдер, в GL вам нужно сначала создать маску с вашего изображения (по своему усмотрению не с GL, который также прост вложен в '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' 'glColor' ... – Spektre

+0

Кажется, излишним использовать Open Gl ES только для этого. Если вы не хотите менять цвет в каждом кадре, я бы рекомендовал загрузить изображение в объект Bitmap и использовать getPixels()/setPixels(), чтобы изменить его так, как вы хотите. В противном случае вам нужно будет написать фрагментарный шейдер для его обработки. –

ответ

0

Чтобы создать такой рисунок, я бы по-прежнему предлагал вам использовать шейдеры, но если нет, то есть еще много способов сделать это, но вам потребуется выполнить как минимум 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, которая приведет к тому, что весь экран будет иметь сплошной цвет.

Смежные вопросы