c++ - 如何使着色器淡入颜色?

标签 c++ shader sfml

这是我当前使用的着色器。它通过缓慢降低不透明度来淡化对象。我想褪色成紫色。如何做到这一点?

着色器片段:

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

shader在main函数中的应用:

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 所做的类似。为此使用mixmix(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 一样设置统一的 purpleFacpurpleFac 应该在 [0.0, 1.0] 范围内。如果 purpleFac1.0 你的片段是紫色的,如果它是 0.0 你的片段颜色只是纹理的颜色。

关于c++ - 如何使着色器淡入颜色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35216654/

相关文章:

c++ - g++ 给出错误 : invalid initialization of reference of type ‘char&’ from expression of type ‘unsigned char’

c++ - OpenCV videoWriter 编解码器问题

c++ - 如何突破 120 字节的限制?

c++ - 使用模板缓冲区概述对象会给出错误的结果

c++ - Steamworks 和 SFML 程序退出时出现访问冲突

c++ - 在我的 7 位加法器中,进位位不正确,我不知道为什么

xna - 如何在 MonoGame 中使用着色器?

opengl-es - 在 OpenGL 中使用着色器向位图字体添加渐变

c++ - 使用纯CMake构建SFML时出现运行时错误

c++ - SFML 绘图像素阵列