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);
}