簡體   English   中英

如何使着色器淡出一種顏色?

[英]How to make a shader fade to a color?

這是我正在使用的當前着色器。 它通過緩慢降低不透明度來淡化對象。 我想淡出紫色。 如何才能做到這一點?

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);
        }

紫色的RGB值是vec3( 1.0, 0.0, 1.0 ) (最大紅色,最小綠色和最大藍色)。 您必須在您的frgment顏色和purpel的顏色值之間進行插值,就像使用opacity 使用mix mix(x, y, a)執行之間的線性插值xy使用a在它們之間的重量。 返回值計算為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 );
}

請注意,您必須設置與opacity相似的均勻purpleFac purpleFac應該在[ purpleFac ]的范圍內。 如果purpleFac1.0您的片段為purpleFac purple,如果為0.0 ,則片段colol僅為紋理的顏色。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM