2016-02-05 121 views
3

这是我正在使用的当前着色器。它通过缓慢减少不透明度来淡化物体。我想淡入紫色。如何才能做到这一点?如何让着色器淡入颜色?

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:

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 

//////////:在主功能着色器的

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

应用//////////////////

//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); 
     } 
+0

Thx对于如此快速的响应,我插入了代码,它做了我希望它做的一半:它确实褪色到紫色,但它看起来像一个使文本模糊的矩形。有没有办法让文本和/或精灵淡出到精灵/文本的紫色轮廓? – agtv

回答

3

紫色的RGB值为vec3(1.0, 0.0, 1.0)(最大红色,最小绿色和最大蓝色)。你必须在你的颜色和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); 
} 

注意,你必须设置统一purpleFac类似你opacity做到这一点。 purpleFac应该在范围[0.0,1.0]内。如果purpleFac1.0您的片段是colord紫色,并且如果它是0.0您的片段colol只是纹理的颜色。