2012-11-21 57 views
4

使用由Kenny Mitchell提供的GLSL着色器源代碼GPU Gems 3,我試圖用SFML 2.0創建一些2D神光線。目前,無論何時編譯和調試項目,mask texture和sprite(分別爲「image.png」和「sprite」)都會完全消失。我目前設置的項目非常簡單,只包含一個main.cpp文件和着色器文件,儘管我覺得我需要比目前更多的東西。任何幫助將非常感激!源代碼將在下面提供。SFML 2.0 GLSL體積光散射着色器

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; 
} 

回答

4

我終於解決了我自己的問題。原來我創建的頂點着色器是不必要的,而我所要做的就是更換:

lightingShader.loadFromFile("lightingShader.vert", "lightingShader.frag");

有了:

lightingShader.loadFromFile("lightingShader.frag", sf::Shader::Type::Fragment);