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

Auteur Sujet: [resolu]Problème Shader  (Lu 3451 fois)

0 Membres et 1 Invité sur ce sujet

Varden

  • Newbie
  • *
  • Messages: 46
    • Voir le profil
[resolu]Problème Shader
« 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://imgur.com/xTtlq9N

au lieu de:


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...
« Modifié: Février 03, 2016, 07:57:38 pm par Varden »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : Problème Shader
« Réponse #1 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é.
Laurent Gomila - SFML developer

Varden

  • Newbie
  • *
  • Messages: 46
    • Voir le profil
Re : Problème Shader
« Réponse #2 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é?

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : Problème Shader
« Réponse #3 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.
Laurent Gomila - SFML developer

Varden

  • Newbie
  • *
  • Messages: 46
    • Voir le profil
Re : Problème Shader
« Réponse #4 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?


Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : Problème Shader
« Réponse #5 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.
Laurent Gomila - SFML developer

Varden

  • Newbie
  • *
  • Messages: 46
    • Voir le profil
Re : Problème Shader
« Réponse #6 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 '^^.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : Problème Shader
« Réponse #7 le: Février 03, 2016, 07:38:03 pm »
Ca doit être ça oui :P
Laurent Gomila - SFML developer

Varden

  • Newbie
  • *
  • Messages: 46
    • Voir le profil
Re : Problème Shader
« Réponse #8 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...

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : [resolu]Problème Shader
« Réponse #9 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.
Laurent Gomila - SFML developer

Varden

  • Newbie
  • *
  • Messages: 46
    • Voir le profil
Re : [resolu]Problème Shader
« Réponse #10 le: Février 04, 2016, 12:20:43 pm »
c'est ce que je pensais. merci pour tes réponses rapides et claires.