我正在开发一款使用OpenGL-ES混合两种纹理的应用。对于叠加图像,我想指定某种颜色作为alpha通道,例如绿色。怎么可以实现呢?我尝试使用glBlendFunc但没有取得多大成功。任何帮助将不胜感激!
答案 0 :(得分:0)
OpenGL本身没有这样的功能,但也许你可以在着色器中实现这个功能:
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进行比较来实现。这很简单,但它可能很慢(我从内存中写它,你必须测试它)。
或者你可以使用另一种计算alpha的方法:
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
}
这是使用平方误差指标来计算alpha。它计算RGB空间中的颜色距离,计算它的平方,并将其与0.1进行比较。这可能有点难以调整阈值(0.1),但可以使用软阈值。如果你有颜色渐变,并希望某些颜色比其他颜色更透明,你可以抛弃步进功能并使用smoothstep代替。