Наложение цветовой смеси в OpenGL ES / iOS / Cocos2d - PullRequest
7 голосов
/ 07 января 2012

Я пытаюсь применить BlendModes к изображению GreyScale, чтобы иметь статические ресурсы многократного использования

Я искал в интернете несколько часов и проводил собственные тесты, но не нашел решения.

Я начал с этого изображения:

enter image description here

И основная идея заключалась в том, чтобы нарисовать над ним прямоугольник определенного цвета и применить режим смешивания к изображению только в том случае, если альфа равна 1,0

.

Вот код (это часть проекта Cocos2d, хотя я думаю, что его можно применить к универсальному OGL ES):

-(void)draw
{
    [super draw];

    glBlendColor(0,255,0,255);

    glBlendFunc(GL_ZERO, GL_SRC_COLOR);
    glColor4ub(255, 0, 255, 255);
    glLineWidth(2);
    CGPoint vertices2[] = { ccp(0,100), ccp(100,100), ccp(100,0) };
    [ DrawingHelper  drawPolygonWithPoints:vertices2 points:3 closePolygon:YES];

}

* Помощник рисования - это логика рисования треугольника.

+(void)drawPolygonWithPoints:(CGPoint *)poli points:(int)points closePolygon:(BOOL)closePolygon
{
    glDisable(GL_TEXTURE_2D);
    glDisableClientState(GL_TEXTURE_COORD_ARRAY);
    glDisableClientState(GL_COLOR_ARRAY);
    glVertexPointer(2, GL_FLOAT, 0, poli);

    if( closePolygon )
        glDrawArrays(GL_TRIANGLE_FAN, 0, points);
    else
        glDrawArrays(GL_LINE_STRIP, 0, points);

    glEnableClientState(GL_COLOR_ARRAY);
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
    glEnable(GL_TEXTURE_2D);
}

А вот некоторые результаты:

enter image description here enter image description here

Как видите, это хорошее приближение, но в этих двух изображениях есть ошибка:

Ошибка OpenGL 0x0502 in - [EAGLView swapBuffers]

Мои вопросы:

  1. Как я могу удалить или исправить эту ошибку?
  2. Как сохранить только альфа изображения (щит) и применить наложение смешанного цвета?

[Обновить] Это пример того, что я хотел бы (с правильными сочетаниями):

enter image description here

1 Ответ

9 голосов
/ 07 января 2012

применить режим смешивания к изображению, только когда альфа равен 1,0

Звучит как приложение для альфа-тестирования. Только то, что я сначала нарисую прямоугольник, а затем провалю альфа-тест на равные 1,0 (или больше 0,99, чтобы учесть некоторый запас). Это не требует смешивания.


Изменить для обновленного вопроса

Желаемые результаты:

enter image description here

Я думаю, вы перепутали заголовки Multiply и Overlay.

Во всех этих случаях это делается с помощью

  • glEnable(GL_ALPHA_TEST); glAlphaFunc(GL_GEQUAL, 0.995); // не использовать 1,0 для некоторого поля

или

  • glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

Эффекты создаются не путем установки функции или режима наложения, а с помощью текстурного окружения или шейдера.

Эффект « Overlay » (фактически умножение) соответствует режиму текстурной среды GL_MODULATE. Или с точки зрения шейдера gl_FragColor = texture2D(...) * color;.

" Осветление " составляет min(texture2D(...), color);

" Multiply " (фактически оверлей) равен gl_FragColor = 1. - (1.-color*texture2D(...))*(1.-color);

" Soft Light " равен gl_FragColor = (1. - (1.-texture2D(...))*(1.-color))*k + b; (k и b выбранные параметры).

...