Forum de la communauté SFML

Aide => Graphique => Discussion démarrée par: Varden le Février 02, 2016, 06:33:12 pm

Titre: [resolu]Problème Shader
Posté par: Varden le Février 02, 2016, 06:33:12 pm
Bonjour/Bonsoir, J'utilise depuis un moment la SFML (2.1 actuellement) et je m'interesse tout juste aux Shaders.

Je ne connais pas vraiment comment fonctionne OpenGl, et je m'en remet a la SFML pour ca, pour le moment. J'ai parcouru le tuto d'OpenClassrooms sur le GLSL, et celui de la SFML et j'ai parcouru le forum mais je ne comprend toujours pas où est mon erreur...

Voici mon code:

#include <SFML/Graphics/RenderWindow.hpp>
#include <SFML/Graphics/Text.hpp>
#include <SFML/Window/Event.hpp>
#include <SFML/Graphics/Shader.hpp>

#include <iostream>

#include "VertexTab/VertexTab.hpp"            //reprise de sf::VertexArray avec quelques methodes persos.

int main()
{
    srand (time(NULL));

    //sf::RenderWindow fenetre(sf::VideoMode::getDesktopMode(), "fenetre", sf::Style::Fullscreen);
    sf::RenderWindow fenetre(sf::VideoMode(1024,512), "fenetre", sf::Style::Default);
    fenetre.setPosition(sf::Vector2i((1920-fenetre.getSize().x)/2,(1080-fenetre.getSize().y)/2));
    fenetre.setVerticalSyncEnabled(true);

    sf::Texture texture1, texture2;

    if (!texture1.loadFromFile("Ressources/pierres_sable.png"))
        return EXIT_FAILURE;

    if (!texture2.loadFromFile("Ressources/pierres_grises.png"))
        return EXIT_FAILURE;

    va::VertexTab rect(sf::Triangles,6);

    //positionnement des vertexs.

    rect[0].position=sf::Vector2f(100.f,100.f);
    rect[1].position=sf::Vector2f(100.f,164.f);
    rect[2].position=sf::Vector2f(164.f,164.f);
    rect[3].position=sf::Vector2f(100.f,100.f);
    rect[4].position=sf::Vector2f(164.f,164.f);
    rect[5].position=sf::Vector2f(164.f,100.f);

    rect[0].texCoords=sf::Vector2f(0.f,0.f);
    rect[1].texCoords=sf::Vector2f(0.f,64.f);
    rect[2].texCoords=sf::Vector2f(64.f,64.f);
    rect[3].texCoords=sf::Vector2f(0.f,0.f);
    rect[4].texCoords=sf::Vector2f(64.f,64.f);
    rect[5].texCoords=sf::Vector2f(64.f,0.f);

    sf::Shader shad1;

    if(!shad1.loadFromFile("Shaders/Shad1.vert","Shaders/Shad1.frag"))
        return EXIT_FAILURE;

    sf::RenderStates etat;
    etat.shader=&shad1;

    shad1.setParameter("texture",texture1);

    while(fenetre.isOpen())
    {
        sf::Event evenements;
        while(fenetre.pollEvent(evenements))
        {
            switch (evenements.type)
            {
                case sf::Event::Closed:
                    fenetre.close();
                    break;
                case sf::Event::KeyPressed:
                    if(evenements.key.code == sf::Keyboard::Escape)
                    {  fenetre.close();  }
                    if(evenements.key.code == sf::Keyboard::F2)
                    {
                        fenetre.capture().saveToFile("capture.png");
                    }
                    break;
                default:
                    break;
            }
        }

        fenetre.clear(sf::Color::Transparent);

        fenetre.draw(rect,etat);

        fenetre.display();
    }

    return EXIT_SUCCESS;
}

et mes shaders, Vertex Shader:

void main()
{
        gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
    gl_FrontColor = gl_Color;
}

copie de l'exemple SFML pour le Fragment Shader:

uniform sampler2D texture;

void main()
{
        // lookup the pixel in the texture
        vec4 pixel = texture2D(texture, gl_TexCoord[0].xy);

        // multiply it by the color
        gl_FragColor = gl_Color * pixel;
}

et le resultat:

(http://i.imgur.com/xTtlq9N.png)
http://imgur.com/xTtlq9N (http://imgur.com/xTtlq9N)

au lieu de:

(http://i.imgur.com/G5N8jfm.png)
http://imgur.com/G5N8jfm (http://imgur.com/G5N8jfm)

Je suppose que j'oublie quelque chose mais j'ai beau chercher, je ne trouve pas de solution autre que celle que j'applique actuellement...

je précise que je ne souhaite pas fournir ma texture au sf::RenderState, sinon ca marche très bien, je souhaite comprendre comment fonctionne les Shader pour par la suite me faire un système qui permet d'utiliser plusieurs texture dans un seul appel a "Draw".

au cas où, je suis sous ubuntu 14.04 mais je doute que ce soit un problème système.

Merci d'avance pour vos réponses et je vous souhaite une agréable soirée/journée dépendant de l'heure a laquelle vous me lirez ^^.

EDIT: comment faire pour afficher des images? je les ai upload sur imgur, mais l'option "inserer image" ne fonctionne pas comme je pensais...
Titre: Re : Problème Shader
Posté par: Laurent le Février 02, 2016, 08:17:00 pm
Citer
Je suppose que j'oublie quelque chose mais j'ai beau chercher, je ne trouve pas de solution autre que celle que j'applique actuellement...
Si ton entité n'a pas de texture (via les render-states), SFML n'active pas ce qu'il faut pour que le texturing fonctionne. En clair, ce que tu veux faire est impossible tel quel.

Citer
comment faire pour afficher des images? je les ai upload sur imgur, mais l'option "inserer image" ne fonctionne pas comme je pensais...
C'est parce que le lien que tu utilises pointe vers une page qui montre l'image, et non l'image directement. J'ai corrigé.
Titre: Re : Problème Shader
Posté par: Varden le Février 02, 2016, 08:30:17 pm
ok, donc ce n'était pas une erreur de ma part coter Shader... et si je fournis une texture, est-ce que je pourrais l'ignorer et faire ce que bon me semble via mon Shader? ou bien suis-je limiter uniquement a la texture que je fournis a mon entité?
Titre: Re : Problème Shader
Posté par: Laurent le Février 02, 2016, 10:10:37 pm
Citer
et si je fournis une texture, est-ce que je pourrais l'ignorer et faire ce que bon me semble via mon Shader?
Oui. Mais n'oublie pas que la matrice de texture (utilisée dans le shader) dépend de la taille de cette texture. En gros, c'est elle qui transforme [0 .. size] en [0 .. 1], donc les coordonnées de texture de tes vertex doivent être calibrées en fonction de sa taille.
Titre: Re : Problème Shader
Posté par: Varden le Février 03, 2016, 05:17:49 pm
donc si je fournis a mon entité une texture de 100*100 et que mon vertex a une coordonnée de 110*90 par exemple, meme si la texture fournit au Shader fait 200*200, ca posera problème? mais dans le cas inverse, si la texture entité est plus grande que celle du Shader, cela pose aussi problème?

Titre: Re : Problème Shader
Posté par: Laurent le Février 03, 2016, 05:36:41 pm
C'est juste que tes coordonnées de texture, une fois normalisées, ne correspondront pas à ce à quoi tu t'attends.
Titre: Re : Problème Shader
Posté par: Varden le Février 03, 2016, 07:06:59 pm
ok, j'ai fait des tests et j'ai pigé ^^. donc en gros pour avoir la coordonnée de texture correcte, je dois faire:

(coordonnée shader/taille texture shader)*taille texture entité

ex:
texture entité: 100*100 - texture shader: 128*128 - coordonnée shader: 128*64

(128/128)*100 = 100
(64/128)*100 = 50

ou bien avoir des textures de tailles identiques.

navré de t'ennuyer avec ce qui doit être très basique '^^.
Titre: Re : Problème Shader
Posté par: Laurent le Février 03, 2016, 07:38:03 pm
Ca doit être ça oui :P
Titre: Re : Problème Shader
Posté par: Varden le Février 03, 2016, 07:57:17 pm
ok, donc c'est pas très genant pour ce que j'ai a en faire ^^.

sinon, plutot que de recréer un post, toute toute dernière question.

quelle est la meilleur methode (si cela est meme possible) pour utiliser plusieurs textures au sein d'un meme appel à draw?
afin de limiter les appels à draw.

je pensais le faire via les Shader justement, en codant dans mon vertex (par exemple dans la coordonnée de texture) le moyen de trouver quelle texture employé dans mon shader. ou bien d'une autre manière que ma piètre connaissance d'OpenGL ne me permet pas encore d'entrevoir...
Titre: Re : [resolu]Problème Shader
Posté par: Laurent le Février 03, 2016, 08:46:30 pm
SFML ne gère pas le multi-texturing, donc si tu veux faire ça il faudra le faire via des moyens détournés. Je pense que le shader est ta seule option.
Titre: Re : [resolu]Problème Shader
Posté par: Varden le Février 04, 2016, 12:20:43 pm
c'est ce que je pensais. merci pour tes réponses rapides et claires.