Forum de la communauté SFML

Aide => Graphique => Discussion démarrée par: Niolak le Juin 24, 2012, 10:30:49 am

Titre: [Aide pour un shader] Associer une profondeur à une couleur
Posté par: Niolak le Juin 24, 2012, 10:30:49 am
Salut !

Je suis en train de me pencher sur les shaders pour une future application, et je n’arrive pas à faire ce que je veux…

Mon objectif : faire en sorte que quel que soit l’ordre d’affichage, les pixels dont la composante verte est la plus élevée soit au dessus de tout.

J’ai donc créé ces shaders :
vertexShader
void main(void)
{
        vec4 position = gl_ModelViewMatrix * gl_Vertex;
        position.z = gl_Color.g;
        gl_Position = gl_ProjectionMatrix * position;
        gl_FrontColor = gl_Color;
}

fragmentShader
void main(void)
{

    gl_FragDepth = gl_Color.g;
    gl_FragColor = gl_Color;

}

Un code minimal de SFML pour tester les shaders :
#include <SFML/Graphics.hpp>

void processEvent(sf::RenderWindow& p_window);

int main()
{
    sf::ContextSettings contextSettings(0xFF, 0, 0xFF);
    sf::RenderWindow window(sf::VideoMode(800, 600), "SFML window", sf::Style::Default, contextSettings);

    sf::VertexArray array1(sf::Triangles, 3);
    array1[0].position.x = 0;
    array1[0].position.y = 0;
    array1[0].color = sf::Color::Green;
    array1[1].position.x = 30;
    array1[1].position.y = 0;
    array1[1].color = sf::Color::Green;
    array1[2].position.x = 0;
    array1[2].position.y = 100;
    array1[2].color = sf::Color::Green;


    sf::VertexArray array2(sf::Triangles, 3);
    array2[0].position.x = 10;
    array2[0].position.y = 20;
    array2[0].color = sf::Color::Blue;
    array2[1].position.x = 50;
    array2[1].position.y = 20;
    array2[1].color = sf::Color::Blue;
    array2[2].position.x = 20;
    array2[2].position.y = 120;
    array2[2].color = sf::Color::Blue;

    sf::Shader shader;
    shader.loadFromFile("vertexShader", "fragmentShader");

    while (window.isOpen())
    {
        processEvent(window);

        window.clear();
        window.draw(array1, sf::RenderStates(&shader));
        window.draw(array2, sf::RenderStates(&shader));
        window.display();
    }

    return EXIT_SUCCESS;
}

void processEvent(sf::RenderWindow& p_window)
{
    sf::Event event;
    while (p_window.pollEvent(event))
    {
        if (event.type == sf::Event::Closed)
            p_window.close();
    }
}

 

Avec ce shader, je pensais que le triangle vert serait au dessus du bleu, ce qui n’est pas le cas…
Du coup, je veux bien un petit coup de main s’il vous plaît :p

Remarque : en ajoutant le depthBuffer au sf::ContextSettings, je pensais que ça résoudrait le problème, mais apparemment non.
Autre remarque : le code SFML que je donne est un code minimal, il va de soi que dans cet exemple, il suffit de dessiner les objets dans l’autre ordre. Toutefois, dans mon vrai programme, chaque vertexArray comporte des pixels plus ou moins verts.

Merci d’avance ;)
Titre: Re : [Aide pour un shader] Associer une profondeur à une couleur
Posté par: Niolak le Juin 30, 2012, 07:25:54 pm
Personne pour m’aider ? :'(
Titre: Re : [Aide pour un shader] Associer une profondeur à une couleur
Posté par: Gregouar le Juillet 11, 2012, 09:53:04 pm
Je ne sais pas si ça t'aide vraiment, mais regarde toujours ce que j'avais écrit ici : http://alpha-arts.net/blog/articles/view/44/z-buffer-2-5d
Titre: Re : [Aide pour un shader] Associer une profondeur à une couleur
Posté par: kamui le Juillet 13, 2012, 04:10:06 pm
Tu appelles d'abord array1 (le vert) dans la méthode draw, puis array2(le bleu) qui du coup est dessiné par dessus. Juste à inverser les deux instructions normalement.