Маскировка в OpenGL ES

reading #20 tutorial on Nehe and a question here about masking, I implemented masking using b/w image and opaque image, however the result is completely not what is expected (I'm using OpenGL ES 1 on iPhone, so can't use shaders).
Source+Mask=Result
As can be seen on the result picture what is white on mask isn't transparent and what is black isn't source color, but white (!) Here is the source code I use to render it:

    // we render from one big texture using coordinates
    // so changing rectangle will change the drawn image
    _pressedFrame = maskRect;
    glBlendFunc(GL_DST_COLOR,GL_ZERO);
    [super render:sender];

    _pressedFrame = normalRect;
    glBlendFunc(GL_ONE,GL_ONE);     
    [super render:sender];

Спасибо за любую помощь!


person Alexander Voloshyn    schedule 23.06.2010    source источник


Ответы (1)


Чтобы метод из учебника NeHe работал правильно, фон вашего исходного изображения (т. е. везде, где изображение маски белое) должен быть полностью черным. Хотя из вашего первого изображения не очевидно, что именно является источником, я подозреваю, что он не черный в местах, которые становятся ярче на финальном изображении.

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

person Pivot    schedule 24.06.2010
comment
Текстура довольно большая, поэтому я надеялся загрузить ее только один раз и использовать простое смешивание ее частей, но поскольку это невозможно, я думаю, что буду использовать мультитекстурирование. Спасибо. - person Alexander Voloshyn; 24.06.2010