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

Auteur Sujet: Calcul déporté sur carte graphique et flottant  (Lu 3169 fois)

0 Membres et 1 Invité sur ce sujet

arthuro

  • Newbie
  • *
  • Messages: 42
    • Voir le profil
    • E-mail
Calcul déporté sur carte graphique et flottant
« le: Mai 21, 2012, 03:50:05 pm »
Bonjour,

Je vous explique ce que je voudrais faire.
Pour un projet étudiant, j'aimerais accélérer le traitement d'un algo qui opère sur plusieurs matrices.
Je voudrais utiliser les PostEffect de la SFML pour cela.
Je fais en gros les même opérations que pour faire un effet de flou, je fait la moyenne des 4 valeurs des 4 plus proches pixel. Seulement ici, je fait une moyenne pondéré variable en fonction de coefficient associé à chaques pixels.

Voila le post-effect :
vec2 dimension
texture potentiel
texture coefficient
texture selection
effect
{
        vec2 pos=vec2(_in.x,1.0-_in.y);

        vec2 xx=vec2(1.0 / dimension.x,0.0);
        vec2 yy=vec2(0.0,1.0 / dimension.y);
        vec4 g = potentiel( pos -xx) * coefficient(pos).r;
        vec4 d = potentiel( pos +xx) * coefficient(pos).g;
        vec4 b = potentiel( pos +yy) * coefficient(pos).b;
        vec4 h = potentiel( pos -yy) * coefficient(pos).a;
        vec4 s=selection(pos);
        if (s.a >0.5)
                _out=s;
        else
                _out=g+d+b+h;
}

Cela marche sauf que j'ai un problème de précision.
OpenGl travail dans ce postEffect avec des flottant qui me donne une précision qui devrait être suffisante, seulement ensuite il envoie le résultat et la SFML qui conserve le resultat comme une image, et ici, les valeur sont des entiers entre [0,255].
J'aurais besoin pour que mon algo fonctionne, être plus précis que 1/256.

Par exemple, pour un simple algo de flou, théoriquement si on l'applique plusieurs fois, on devrait tendre vers une image uniforme, en réalité, il y a un moment on les petite fluctuations (<1/256) ne pèse plus assez et disparaissent avec l'arrondis, l'algo de flou n'avance plus.   Mon problème est équivalent.

Une idée pour travailler avec des flottant (voir double)   en utilisant la carte graphique pour les calculs?

Si ça peut aider, voila la fonction ou j'utilise ce PostEffect:
void iteration(RenderWindow& screen,Image& potentiel,Image& selection,Image& coefficient,int n)
{
        Sprite spr;
        spr.SetImage(potentiel);
        spr.SetPosition(0,0);
        screen.Draw(spr);
       
        EffectIteration.SetTexture("potentiel",NULL);
        EffectIteration.SetTexture("coefficient", &coefficient);
        EffectIteration.SetTexture("selection", &selection);
        EffectIteration.SetParameter("dimension", screen.GetWidth(),screen.GetHeight());
        screen.Draw(EffectIteration);
       
        for(int i=0;i<n;++i)
        {
                screen.Draw(EffectIteration);
        }
        screen.Display();
        potentiel.CopyScreen(screen);
}

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Calcul déporté sur carte graphique et flottant
« Réponse #1 le: Mai 21, 2012, 04:07:37 pm »
La solution serait d'utiliser des textures avec composantes 16 ou 32 bits, mais SFML ne supporte pas cette fonctionnalité.

Mais de nos jours il y a des APIs bien plus efficaces pour faire du calcul sur GPU (OpenCL, CUDA, ...), pas besoin de s'embêter avec des textures et des pixels.
Laurent Gomila - SFML developer

arthuro

  • Newbie
  • *
  • Messages: 42
    • Voir le profil
    • E-mail
Re : Calcul déporté sur carte graphique et flottant
« Réponse #2 le: Mai 21, 2012, 05:13:44 pm »
Merci encore Laurent.
Je vais chercher dans ce sens.
J’espérais une solution avec la SFML, car avec la SFML, tout est simple.
A+

[edit]
Je crois que je pourrais faire une croix sur OpenCl vu la difficulté pour l'installer sur linux. Et la non garantis que ça puisse fonctionner avec ma carte graphique.
Je vais plutôt essayer de passer deux images, une qui stockera les chiffre fort et l'autre les faible.

Sinon, une dernier question, à propos du double buffering.
Si je modifie une RenderWindow par des Draw.
Puis je fait Display
Ensuite les nouveaux Draw se feront sur la précédente image construite ou sur une autre?

Derniere question, peut-on modifier une image lors d'un postEffect, de la même manière qu'on assigne une valeur à _out?
« Modifié: Mai 21, 2012, 05:56:06 pm par arthuro »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Calcul déporté sur carte graphique et flottant
« Réponse #3 le: Mai 21, 2012, 10:22:27 pm »
Citer
Sinon, une dernier question, à propos du double buffering.
Si je modifie une RenderWindow par des Draw.
Puis je fait Display
Ensuite les nouveaux Draw se feront sur la précédente image construite ou sur une autre?
Si tu poses ce genre de question, c'est que tu cherches à faire un truc erroné.

Citer
Derniere question, peut-on modifier une image lors d'un postEffect, de la même manière qu'on assigne une valeur à _out?
Non, un shader ne peut sortir que la valeur du pixel courant, et rien d'autre.
Laurent Gomila - SFML developer

arthuro

  • Newbie
  • *
  • Messages: 42
    • Voir le profil
    • E-mail
Re : Calcul déporté sur carte graphique et flottant
« Réponse #4 le: Mai 22, 2012, 08:47:54 pm »
D'accord merci.