If you've got a couple 640x480 images laying around, you can try out the following:
#include <SFML\Graphics.hpp>
void main()
{
sf::RenderWindow window(sf::VideoMode(640, 480), "SFML - Transparency");
sf::Texture base ;
base.loadFromFile("base.png");
sf::Texture overlay ;
overlay.loadFromFile("overlay.png") ;
sf::Vertex wholeScreen[] =
{
sf::Vertex(sf::Vector2f( 0, 0), sf::Vector2f( 0, 0)),
sf::Vertex(sf::Vector2f(639, 0), sf::Vector2f(639, 0)),
sf::Vertex(sf::Vector2f( 0,479), sf::Vector2f( 0,479)),
sf::Vertex(sf::Vector2f(639,479), sf::Vector2f(639,479))
};
float overlayOpacity = 0.5f ;
sf::Shader transparency ;
transparency.loadFromFile("transparency.frag", sf::Shader::Fragment) ;
transparency.setParameter("opacity", overlayOpacity) ;
transparency.setParameter("texture", sf::Shader::CurrentTexture) ;
sf::RenderStates overlayStates ;
overlayStates.blendMode = sf::BlendAlpha ;
overlayStates.shader = &transparency ;
overlayStates.texture = &overlay ;
while ( window.isOpen() )
{
sf::Event event ;
while ( window.pollEvent(event) )
{
if ( event.type == sf::Event::Closed )
window.close() ;
else if ( event.type == sf::Event::KeyReleased )
{
if ( event.key.code == sf::Keyboard::Equal )
if ( (overlayOpacity += 0.1f) > 0.9f )
overlayOpacity = 1.0f ;
if ( event.key.code == sf::Keyboard::Dash )
if ( (overlayOpacity -= 0.1f) < 0.1f )
overlayOpacity = 0.0f ;
}
}
transparency.setParameter("opacity", overlayOpacity) ;
window.clear() ;
window.draw(wholeScreen, 4, sf::TrianglesStrip, &base) ;
window.draw(wholeScreen, 4, sf::TrianglesStrip, overlayStates) ;
window.display() ;
}
}
transparency.frag:
uniform float opacity ;
uniform sampler2D texture;
void main()
{
vec4 color = texture2D(texture, gl_TexCoord[0].xy);
color.a *= opacity ;
gl_FragColor = color ;
}