有没有办法为sampler2D纹理设置alpha通道颜色?

时间:2011-10-20 17:32:17

标签: opengl-es-2.0

我正在开发一款使用OpenGL-ES混合两种纹理的应用。对于叠加图像,我想指定某种颜色作为alpha通道,例如绿色。怎么可以实现呢?我尝试使用glBlendFunc但没有取得多大成功。任何帮助将不胜感激!

1 个答案:

答案 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代替。