Плавное смешение цветов в OpenGL

Я пытаюсь добиться следующего смешивания, когда текстура в одной вершине сливается с другой:

Изображение нарисовано в приложении Paper iPad от FiftyThree

Вот что у меня сейчас есть:

Я включил смешивание и определяю функцию смешивания как:

    glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);

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

Как мне достичь желаемого эффекта?

ОБНОВИТЬ:

Я думаю, что происходит то, что пересекаемая область двух текстур получает альфа-канал для изменения (либо аддитивной, либо какой-либо другой пользовательской функции), пока текстура не прорисовывается в пересекаемой области. Остальная часть области имеет оставшуюся текстуру. Вот так:

Я не совсем уверен, как достичь этого результата.

2 ответа

Вы можете добиться этого эффекта с максимальным смешиванием для альфа. Или вручную (смешивая) с шейдером (OpenGL ES 2.0):

#extension GL_EXT_shader_framebuffer_fetch : require
precision highp float;

uniform sampler2D texture;
uniform vec4      color;

varying vec2 texCoords;

void main() {
    float res_a =gl_LastFragData[0].a;
    float a = texture2D(texture, texCoords).a;
    res_a = max(a, res_a);
    gl_FragColor = vec4(color.rgb * res_a, res_a);
}

Результат:

Вам не нужно смешивать для этого (и это не будет работать так, как вы хотите).

Я думаю, что до тех пор, пока вы определяете координату текстуры в пространстве экрана, она должна быть бесшовной между двумя отдельными кругами.

Чтобы сделать это, вместо использования текстурной координаты, переданной через вершинный шейдер, просто используйте положение фрагмента для выборки текстуры, плюс или минус некоторое масштабирование:

float texcoord = gl_FragCoord / vec2(xresolution_in_pixels, yresolution_in_pixels);`
gl_FragColor = glTexture2D(papertexture, texcoord);

Если у вас нет доступа к GLSL, вы можете сделать что-то вместо буфера трафарета. Просто нарисуйте все свои круги в буфере трафарета, используйте объединенную область в качестве маски трафарета, а затем нарисуйте полноэкранный квад из вашей текстуры. Цвет будет легко нанесен на объединение всех кругов.

Другие вопросы по тегам