#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.