Try this:
#include <SFML/Graphics.hpp>
int main() {
//Render window
sf::RenderWindow window( sf::VideoMode( 800, 600, 32 ), "GL States Issue" );
//Multisampler textures
sf::Texture prime1Tex;
sf::Texture prime2Tex;
sf::Texture prime3Tex;
prime1Tex.loadFromFile("prime1.png");
prime2Tex.loadFromFile("prime2.png");
prime3Tex.loadFromFile("prime3.png");
prime1Tex.setRepeated(true) ;
prime2Tex.setRepeated(true) ;
prime3Tex.setRepeated(true) ;
prime1Tex.setSmooth(true) ;
prime2Tex.setSmooth(true) ;
prime3Tex.setSmooth(true) ;
//Mutlisample shader - Samples from 3 repeating prime textures to significantly reduce tiling patterns
sf::Shader multisamplerShader;
multisamplerShader.loadFromFile("multisampler.sfx", sf::Shader::Fragment);
multisamplerShader.setParameter("prime1Tex", prime1Tex);//sf::Shader::CurrentTexture);
multisamplerShader.setParameter("prime2Tex", prime2Tex);
multisamplerShader.setParameter("prime3Tex", prime3Tex);
multisamplerShader.setParameter("screenSize", sf::Vector2f(800,600)) ;
//Random extra sprite to draw
sf::Sprite proj;
sf::Texture projTex;
projTex.loadFromFile("randomsprite.png");
proj.setTexture(projTex);
//Vertex array storing tile data.
sf::VertexArray tileDetails;
tileDetails.setPrimitiveType(sf::Triangles);
tileDetails.append(sf::Vertex(sf::Vector2f(20.0f, 20.0f), sf::Vector2f(20.0f,20.0f)));
tileDetails.append(sf::Vertex(sf::Vector2f(20.0f, 500.0f), sf::Vector2f(20.0f,500.0f)));
tileDetails.append(sf::Vertex(sf::Vector2f(500.0f, 500.0f), sf::Vector2f(500.0f,500.0f)));
bool run = true;
while(run)
{
window.clear(sf::Color::Cyan);
window.draw(proj);
window.draw(tileDetails, &multisamplerShader);
window.display();
sf::Event Event ;
while (window.pollEvent(Event))
{
if ((Event.type == sf::Event::KeyPressed && (Event.key.code == sf::Keyboard::Escape))) {run = false; }
}
}
}
With the shader changed to:
uniform sampler2D prime1Tex;
uniform sampler2D prime2Tex;
uniform sampler2D prime3Tex;
uniform vec2 screenSize ;
void main()
{
// normalized screen coordinates.
vec2 pixelPos = gl_FragCoord.xy / screenSize ;
//Get the pixel data from each texture
vec4 prime1Fragment = texture2D(prime1Tex, pixelPos);
vec4 prime2Fragment = texture2D(prime2Tex, pixelPos);
vec4 prime3Fragment = texture2D(prime3Tex, pixelPos);
//Combine them together
vec4 finalFragment = prime1Fragment * 0.33 + prime2Fragment * 0.33 + prime3Fragment * 0.33;
finalFragment.a = 1.0;
gl_FragColor = finalFragment;
}
The texture coordinates in gl_TextCoord in a fragment shader are normalized. I think the "correct" way to do this would probably involve a vertex shader, but the results looked reasonable to me.