Using the source code for the GLSL shader provided by Kenny Mitchell in the Gems 3 GPU, I tried to create some 2D gods using SFML 2.0. Currently, whenever I compile and debug a project, the mask texture and sprite ("image.png" and "sprite" respectively) completely disappear. The project that I just set up is very rude, consisting of only one main.cpp file and shader files, although I have a feeling that I will need more than what I currently have. Any help is appreciated! The source code will be given below.
main.cpp:
#include <SFML\Graphics.hpp> #include <SFML\System.hpp> #include <SFML\Window.hpp> #include <iostream> void main() { sf::RenderWindow _window(sf::VideoMode(800, 480, 32), "Lighting Test"); _window.setFramerateLimit(60); sf::Shader lightingShader; sf::RenderStates renderState; sf::Texture texture; texture.loadFromFile("image.png"); sf::Sprite sprite; sprite.setTexture(texture); sf::Texture backgroundTexture; backgroundTexture.loadFromFile("light.png"); sf::Sprite background; background.setTexture(backgroundTexture); while (_window.isOpen()) { int x = sf::Mouse::getPosition(_window).x; int y = sf::Mouse::getPosition(_window).y; lightingShader.loadFromFile("lightingShader.vert", "lightingShader.frag"); lightingShader.setParameter("exposure", 0.25f); lightingShader.setParameter("decay", 0.97f); lightingShader.setParameter("density", 0.97f); lightingShader.setParameter("weight", 0.5f); lightingShader.setParameter("lightPositionOnScreen", sf::Vector2f(0.5f, 0.5f)); lightingShader.setParameter("myTexture", sf::Shader::CurrentTexture); renderState.shader = &lightingShader; _window.clear(sf::Color::Black); sprite.setPosition(x, y); //sprite.setColor(sf::Color::Black); //background.setPosition(400, 240); _window.draw(background); _window.draw(sprite, renderState); _window.display(); } }
lightingShader.vert:
void main() { gl_TexCoord[0] = gl_MultiTexCoord0; gl_Position = ftransform(); }
lightingShader.frag:
uniform float exposure; uniform float decay; uniform float density; uniform float weight; uniform vec2 lightPositionOnScreen; uniform sampler2D myTexture; const int NUM_SAMPLES = 100 ; void main() { vec2 deltaTextCoord = vec2( gl_TexCoord[0].st - lightPositionOnScreen.xy ); vec2 textCoord = gl_TexCoord[0].st; deltaTextCoord *= 1.0 / float(NUM_SAMPLES) * density; float illuminationDecay = 1.0; for(int i=0; i < NUM_SAMPLES ; i++) { textCoord -= deltaTextCoord; vec4 sample = texture2D(myTexture, textCoord); sample *= illuminationDecay * weight; gl_FragColor += sample; illuminationDecay *= decay; } gl_FragColor *= exposure; }
source share