фрагмент шейдера нескольких светлых точек - PullRequest
0 голосов
/ 26 ноября 2018

У меня есть этот шейдер, который позволяет мне немного освещать игрока, теперь я хочу добавить в игру более 1 очка.например, когда стреляет пуля, она также создает эту «зону» вокруг нее ... только с тем, что у меня сейчас есть, она рисует только пулю, а не игрока.

Как я могу добавить несколько очковк тому же, как он может редактировать шейдер для обработки массива ??

часть в функции рендеринга

    sf::Shader shader;
shader.setParameter("texture", sf::Shader::CurrentTexture);
shader.setParameter("lcolor", sf::Color(255, 255, 255, 100));
std::vector<sf::Vector3f> unarray;


if (shader.loadFromFile("lights.frag", sf::Shader::Fragment))
{
    size_t i = 0;
    for (auto e : m_entityManager.getEntities())
    {
        if (e->hasComponent<CLight>())
        {
            Vec2 pos = e->getComponent<CTransform>()->pos;
            //unarray.push_back();
            int offSet = windowCenterX==pPos.x ? pPos.x -m_game.window().getSize().x / 2.0f :0 ;
            shader.setParameter("light", sf::Vector3f(pos.x- offSet, pos.y, e->getComponent<CLight>()->size));


            i++;
        }
    }
    //converting to the correct coords
    sf::Vector2f coord_pos = m_game.window().mapPixelToCoords(sf::Vector2i(0, 0));
    sf::RectangleShape rect;
    rect.setPosition(coord_pos);
    rect.setSize(sf::Vector2f(m_game.window().getSize().x, m_game.window().getSize().y));
    m_game.window().draw(rect, &shader);
}

шейдер:

 uniform sampler2D texture ;
uniform vec3 light;
uniform vec4 lcolor;

void main() {
    float distance = sqrt(pow(gl_FragCoord.x - light.x, 2) + pow(gl_FragCoord.y - light.y, 2));

    if (floor(light.x) == floor(gl_FragCoord.x) && floor(light.y) == floor (gl_FragCoord.y)) 
        distance = 0.1;

    if (distance > light.z) 
        distance = light.z;

    vec2 pos = gl_TexCoord[0].xy ; 
    gl_FragColor = mix(texture2D(texture,pos), lcolor, 1.0-(distance/light.z)); 

}

outlook of shader

...