4

使用 Kenny Mitchell 在GPU Gems 3中提供的 GLSL 着色器源代码,我尝试使用 SFML 2.0 创建一些 2D 神射线。目前,每当我编译和调试项目时,蒙版纹理和精灵(分别为“image.png”和“sprite”)完全消失。我目前建立的项目非常粗糙,只包含一个 main.cpp 文件和着色器文件,尽管我觉得我需要的比目前更多。任何帮助将非常感激!下面将提供源代码。

主.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

1 回答 1

4

我终于自己解决了这个问题。原来我创建的顶点着色器是不必要的,我所要做的就是替换:

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

和:

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

于 2012-11-24T01:26:16.723 回答