如何使着色器淡出一种颜色?

时间:2016-02-05 05:08:29

标签: c++ shader sfml

这是我正在使用的当前着色器。它通过缓慢降低不透明度来淡化对象。我想淡出紫色。怎么办呢?

shader.frag:

uniform sampler2D texture;
uniform float opacity;

void main()
{
    vec4 pixel = texture2D(texture, gl_TexCoord[0].xy);
    gl_FragColor = pixel * vec4(1.0, 1.0, 1.0, opacity);
}

shader.vert:

void main()
{
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
    gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
    gl_FrontColor = gl_Color;
}

在主函数中应用着色器:

sf::Shader shader;
if (!shader.loadFromFile("shader.vert", "shader.frag"))
    return EXIT_FAILURE;

float opacity = 1.0; //transparency of shader
shader.setParameter("texture", sf::Shader::CurrentTexture); //shader.vert
shader.setParameter("opacity", opacity);                    //shader.frag

////////////////////////////

//Delete Text Display
    counter1 = 0;
    for (iter8 = textDisplayArray.begin(); iter8 != textDisplayArray.end(); iter8++)
    {
        if (textDisplayArray[counter1].destroy == true)
        {
            //shader
            opacity -= 0.1;         
            if (opacity <= 0)
            {
                textDisplayArray.erase(iter8);
                opacity = 1;
            }
            shader.setParameter("opacity", opacity);
        }

1 个答案:

答案 0 :(得分:3)

紫色的RGB值为vec3( 1.0, 0.0, 1.0 )(最大红色,最小绿色和最大蓝色)。你必须在你的frgment颜色和purpel的颜色值之间进行插值,就像使用opacity一样。请使用mixmix(x, y, a)使用xya之间执行线性插值,以对它们进行加权。返回值计算为 x×(1-a)+ y×ax×(1-a)+ y×a

uniform sampler2D texture;
uniform float opacity;
uniform float purpleFac;

void main()
{
    vec4 pixel = texture2D(texture, gl_TexCoord[0].xy);
    vec3 mixedCol = mix( vec3( 1.0, 0.0, 1.0 ), pixel.rgb, purpleFac );
    gl_FragColor = vec4( mixedCol , opacity );
}

请注意,您必须设置与purpleFac相似的统一opacitypurpleFac应该在范围[0.0,1.0]内。如果purpleFac1.0,则您的片段为colord purple,如果为0.0,则您的片段colol仅为纹理的颜色。