如何在不改变原始颜色的情况下使用着色器

时间:2016-02-10 03:37:00

标签: c++ shader sfml

我有一个文本类,以彩色字体显示数字。当我不使用我的着色器时,一些文本以浅绿色显示,而其他文本以白色显示,按设计显示。当我使用着色器时,所有文本都是白色的。我很确定这是因为在shader.frag中我有rgb作为vec4(1.0,1.0,1.0,不透明度); 但是,我不知道如何为某些类型的文本更改这些值,而不是为其他类型的文本更改。我想要做的是保持文本的原始颜色,并慢慢减少不透明度。如何修改此代码来执行此操作? 这是我的代码,其中包含以下内容的实现:

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

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

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

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

//删除文字显示

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 :(得分:1)

您只需在片段着色器中使用 gl_Color

shader.frag:

uniform sampler2D texture;
uniform float opacity;

void main()
{
    vec4 pixel   = texture2D(texture, gl_TexCoord[0].xy);
    gl_FragColor = pixel * vec4( gl_Color.rgb, opacity );
                              // ^        ^^^ RGB-color passed by vertex shader
}

<强> shader.vert:

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