2013-11-02 1 views
4

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

enter image description here

Однако независимо от того, сколько раз я рисую над местом, результирующий цвет никогда не turnts черный; на самом деле он перестает меняться после нескольких строк. Фотошоп говорит, что альфа blob, нарисованная слева в OpenGL, составляет максимум 0,8, где я ожидаю, что она будет равна 1.

Мое приложение работает, рисуя серии марок, как в примере Apple GLPaint, чтобы сформировать линию. Штампы смешивают со следующей функцией:

glBlendFuncSeparate(GL_ONE, GL_ONE_MINUS_SRC_ALPHA, GL_ONE_MINUS_DST_ALPHA, GL_ONE); 
glBlendEquation(GL_FUNC_ADD); 

Мой пиксельный шейдер:

uniform lowp sampler2D u_texture; 
varying highp vec4 f_color; 

void main(){ 
    gl_FragColor = texture2D(u_texture, gl_PointCoord).aaaa*f_color*vec4(f_color.aaa, 1); 
} 

Как следует настроить смешивание, чтобы получить полный цвет при рисовании несколько раз?

Update 07/11/2013

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

glGenFramebuffers(1, &textureFramebuffer); 
    glBindFramebuffer(GL_FRAMEBUFFER, textureFramebuffer); 

    glGenTextures(1, &drawingTexture); 
    glBindTexture(GL_TEXTURE_2D, drawingTexture); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, pixelWidth, pixelHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); 

Update 02/12/2013 Я попытался модифицировать программу GLPaint Apple, чтобы и оказалось, что такое поведение наблюдается только на iOS7. Как видно на скриншотах ниже, цвета на iOS 7 немного бледнеют и не смешиваются красиво.

GL_ONE, GL_ONE_MINUS_SRC_ALPHA 

blend функция хорошо подходит для iOS6. Может ли это быть вызвано реализацией iOS7 CALAyer или чем-то еще и как его решить?

iOS6iOS7

Update 10/07/2014

компании Apple недавно обновила свой GLPaint образец для iOS7 и проблема наблюдается там, тоже. Я сделал отдельную тему на основе их кода: Unmodified iOS7 Apple GLPaint example blending issue

+0

Вы пробовали использовать сэмплер с более высокой точностью? Если я не ошибаюсь, 'mediump' является объявлением по умолчанию для униформы семплера. –

+0

@ AndonM.Coleman Я просто пробовал как средние, так и высокие, без эффекта. Я думаю, для этого приложения достаточно низкого уровня. – Hristo

+0

Это именно то, что я вижу (или очень похоже). Вы нашли какое-либо решение или достигли какого-либо прогресса?SktetchBookX для iPhone делает именно то, что я хочу. –

ответ

1

Просто потому, что ваша кисть «затемняет» изображение не означает, что это было субтрактивное смешивание. Это в лицо регулярное смешивание добавок, где черная кисть просто перегружает изображение. Вам нужна функция смешивания (GL_ONE, GL_ONE_MINUS_SRC_ALPHA) (неразделенная). Кисть содержится только в альфа-канале текстуры, в текстуре нет цветовых каналов, цвет кисти определяется glColor или эквивалентной униформой.

Использование значения альфа-адресации не требуется в большинстве случаев.

+0

@Hristo: добавив к тому, что обсуждалось datenwolf, целевые альфа-битовые плоскости даже не определены в удивительно большом числе случаев. Для этого вам понадобится формат пикселей RGBA, поскольку A просто отбрасывается после смешивания в формате RGB. Трудно сказать, будет ли в этом случае работать с альфа-смешиванием. Это зависит от формата пикселя вашего контекста. –

+1

Я заменил функцию blend, как предложил datenwolf, но я не вижу никакой разницы. «GL_ONE_MINUS_DST_ALPHA» был просто оставлен от предыдущих попыток заставить его работать :) – Hristo