2016-02-05 138 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只是紋理的顏色。