[英]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)
執行之間的線性插值x
和y
使用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
]的范圍內。 如果purpleFac
為1.0
您的片段為purpleFac
purple,如果為0.0
,則片段colol僅為紋理的顏色。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.