SFML - Partie 5 - Shaders

Cet article appartient à une série de tutoriels dédiés à SFML. Le lecteur est invité à se référer aux autres sections de ce tutoriel en suivant ce lien : SFML tutoriel.

Introduction

Cette page explique comment afficher un shader avec SFML. L'exemple présenté sur cette page a été réalisé avec les versions suivantes :

Cette vidéo vous donne un aperçu du résultat :

Exemple et code source

Cet exemple montre comment utiliser les shaders avec SFML. Les shaders sont programmés et exécutés dans le GPU (Graphics Processing Unit). L'avantage est de libérer le processeur principal pour qu'il puisse réaliser d'autres calcul.

#include <SFML/Graphics.hpp>
#include <iostream>

// Examples from http://glslsandbox.com/
// Example 1 : mouse on fire
// Example 2 : scrolling of shapes
// Example 3 : cells
// Example 4 : fire
// Example 5 : moving circles
// Example 6 : smoke
// Example 7 : horizontal scrolling mountains
#define SHADER_FILENAME         "../example_001.frag"
//#define SHADER_FILENAME         "../example_002.frag"
//#define SHADER_FILENAME         "../example_003.frag"
//#define SHADER_FILENAME         "../example_004.frag"
//#define SHADER_FILENAME         "../example_005.frag"
//#define SHADER_FILENAME         "../example_006.frag"
//#define SHADER_FILENAME         "../example_007.frag"

#define     WINDOW_WIDTH    800
#define     WINDOW_HEIGHT   600

int main()
{

    // Create a non resizable window
    sf::RenderWindow window(sf::VideoMode(WINDOW_WIDTH, WINDOW_HEIGHT), "SFML Shader Example", sf::Style::Titlebar | sf::Style::Close);

    // Create a window size texture and a sprite for the shader
    sf::Texture tex;
    tex.create(WINDOW_WIDTH, WINDOW_HEIGHT);
    sf::Sprite spr(tex);

    // Create an load the shader from file
    sf::Shader shader;
    shader.loadFromFile(SHADER_FILENAME, sf::Shader::Fragment);
    if (!shader.isAvailable()) {
        std::cout << "The shader is not available\n";
        return -1;
    }

    // Set the resolution parameter (initial window size)
    shader.setParameter("resolution", sf::Vector2f(WINDOW_WIDTH , WINDOW_HEIGHT));

    // Use a timer to obtain the time elapsed
    sf::Clock clk;

   // Main loop
    while (window.isOpen()) {
        // Event handling
        sf::Event event;

        // Event loop (keyboard, mouse ...
        while (window.pollEvent(event))
        {
            // Close the window if a key is pressed or if requested
            if (event.type == sf::Event::Closed) window.close();

            // Exit the app when a key is pressed
            if (event.type == sf::Event::KeyPressed) window.close();
        }

        // Set the others parameters who need to be updated every frames (time and mouse)
        shader.setParameter("time", clk.getElapsedTime().asSeconds());
        sf::Vector2i mousePos = sf::Mouse::getPosition(window);
        shader.setParameter("mouse", sf::Vector2f(mousePos.x, mousePos.y - WINDOW_HEIGHT/2));

        // Draw the sprite with the shader on it
        window.clear();
        window.draw(spr, &shader);
        window.display();
    }

    return 0;
}

Téléchargement

Les fichiers et les codes sources peuvent être téléchargés depuis GitLab :

Code source sur GitLab

Voir aussi


Dernière mise à jour : 15/03/2021