Есть ли способ установить цвет альфа-канала для текстуры sampler2D?

#opengl-es-2.0

#opengl-es-2.0

Вопрос:

Я работаю над приложением, которое использует OpenGL-ES для смешивания двух текстур. Для наложения изображения я хочу указать определенный цвет в качестве альфа-канала, например) зеленый. Как это могло быть достигнуто? Я пытался использовать glBlendFunc без особого успеха. Любая помощь будет очень признательна!

Ответ №1:

в самом OpenGL такой функции нет, но, возможно, вы могли бы добиться этого в shader:

 uniform vec3 colorMask; // eg. green

varying vec2 texCoord;
uniform sampler2D overlay;

void main()
{
    vec4 texture = texture2D(overlay, texCoord);
    // get RGB of the texture

    vec3 absdiff = abs(texture.rgb - colorMask);
    float alpha = all(lessThan(absdiff, vec3(0.1)))? 1.0 : 0.0;
    // calculate alpha using vector relational functions

    texture.a = alpha; // use alpha

    gl_FragColor = texture;
    // write final color, can use blending
}
 

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

Или вы можете использовать другой способ вычисления альфа-сигнала:

 uniform vec3 colorMask; // eg. green

varying vec2 texCoord;
uniform sampler2D overlay;

void main()
{
    vec4 texture = texture2D(overlay, texCoord);
    // get RGB of the texture

    vec3 diff = texture.rgb - colorMask;
    float alpha = step(dot(diff, diff), 0.1);
    // calculate alpha using difference squared and a step function

    texture.a = alpha; // use alpha

    gl_FragColor = texture;
    // write final color, can use blending
}
 

Это использует метрику квадратной ошибки для вычисления альфа. Он вычисляет расстояние между цветами в пространстве RGB, вычисляет его квадрат и сравнивает с 0,1. Это может быть немного сложнее настроить пороговое значение (0,1), но позволяет использовать мягкий порог. Если у вас должен был быть цветовой градиент и вы хотели, чтобы некоторые цвета были более прозрачными, чем другие, вы можете отказаться от функции step и вместо этого использовать smoothstep.