Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: [Aide pour un shader] Associer une profondeur à une couleur  (Lu 2645 fois)

0 Membres et 1 Invité sur ce sujet

Niolak

  • Newbie
  • *
  • Messages: 25
    • Voir le profil
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 ;)
Redécouvrez la frappe au clavier avec la disposition bépo.

Niolak

  • Newbie
  • *
  • Messages: 25
    • Voir le profil
Re : [Aide pour un shader] Associer une profondeur à une couleur
« Réponse #1 le: Juin 30, 2012, 07:25:54 pm »
Personne pour m’aider ? :'(
Redécouvrez la frappe au clavier avec la disposition bépo.

Gregouar

  • Sr. Member
  • ****
  • Messages: 462
  • www.holyspirit.fr : free hack'&'slash
    • Live Messenger (MSN) - Greg_le_sadique@hotmail.com
    • Voir le profil
    • www.holyspirit.fr
    • E-mail
Re : [Aide pour un shader] Associer une profondeur à une couleur
« Réponse #2 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
« Modifié: Juillet 11, 2012, 10:14:53 pm par Laurent »

kamui

  • Sr. Member
  • ****
  • Messages: 291
    • Voir le profil
Re : [Aide pour un shader] Associer une profondeur à une couleur
« Réponse #3 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.