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

Auteur Sujet: Shaders et rendus parallèlisés  (Lu 1598 fois)

0 Membres et 1 Invité sur ce sujet

Niloc

  • Newbie
  • *
  • Messages: 3
    • Voir le profil
Shaders et rendus parallèlisés
« le: Décembre 15, 2014, 11:01:17 pm »
Bonsoir,
Je travaille actuellement sur un moteur de lumière en SFML/GLSL pour un moteur graphique 3D en vue du dessus.
Il s'agit en réalité de 2D avec un rendu de lumière donnant le relief.
Je génère une texture pour la couleur du sol (luminosité normale) ainsi qu'une texture regroupant différentes informations (altitude du pixel, grain, coefficient de réflexion) et une normale map. Une fois que c'est fait, je dessine une texture correspondant à la quantité de lumière renvoyée à la caméra par chaque source lumineuse sur une renderTexture différente avant d'assembler l'ensemble et de l'appliquer à la texture contenant les couleurs des pixels.

http://image.noelshack.com/fichiers/2014/51/1418680212-10468673-1542931919277852-2621293921420467349-o.jpg (un prototype)

Étant donné la lourdeur du traitement il n'est pas possible de traiter à la suite plus de deux ou trois sources lumineuses (sur ma carte graphique en tout cas) aussi je souhaiterais paralléliser les calculs des différentes sources lumineuses dans des threads séparés.


Mes questions exactes sont les suivantes :

J'ai besoin d'utiliser un même shader dans plusieurs threads en même temps :
Est-ce possible ou fait il que chaque thread ait son propre sf::shader distinct ?

Étant donné que j'ai besoin de passer au shader certains paramètres propres à chaque source lumineuse comme la position de celle-ci (son aire d'effet est passée comme un vertexArray), est_il possible d'envoyer des paramètres qui ne soient pas commun au shader complet mais valables seulement pour une seule de ses applications (un seul draw() ) ?

S'il me faut prévoir autant de sf::shaders qu'il y a de sources lumineuses, est-il possible de dupliquer un sf::shader ou faut-il absolument que je compile son code source autant de fois que j'en ai besoin (donc sûrement à l'avance).

Je vous remercie par avance pour votre aide (et pour votre patience pour lire ce post).
« Modifié: Décembre 15, 2014, 11:14:12 pm par Niloc »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Shaders et rendus parallèlisés
« Réponse #1 le: Décembre 16, 2014, 07:51:39 am »
Oublie les threads, ton GPU n'a qu'un seul coeur... ;)
Laurent Gomila - SFML developer

Niloc

  • Newbie
  • *
  • Messages: 3
    • Voir le profil
Re : Shaders et rendus parallèlisés
« Réponse #2 le: Décembre 16, 2014, 11:23:54 am »
Techniquement ma GT650m en a 384... mais j'ai du manquer quelque chose de fondamental dans le fonctionnement d'un GPU ou de l'openGL alors.

En fait j'ai pu observer que les temps d’exécution de mes algos semblaient être du même ordre entre la GTX760 d'un ami (1152 cœurs) et la GT 820 de ma petite sœur (nb de cœur apparemment pas avouable)... J'en ai déduit que la différence de nombre de cœurs internes n'était pas exploitée et que je pourrais donc paralléliser le calcul assez simplement en parallélisant des appels OpenGL.
Je ne trouve rien actuellement sur la façon dont OpenGL utilise le parallélisme, seulement la façon de paralléliser les calculs scientifiques sur GPU.


Du coup je ne comprends pas le peu de différence dans les performances de mon programme sur les différents ordis sur lesquels j'ai pu faire des essais... Est-ce que le nombre de cœur n'est juste pas exploité par OpenGL ? ou seulement pour paralléliser le traitement des vertices et des pixels pour un seul shader à la fois ? (Je ne modifie que le Vertex Shader mais ça aurait du se voir quand même). Ou est-ce que l'exploitation de ces cœur n'a pas du tout cet usage là ?
Peut être, si tu peux m'éclairer...



Je dois dire au fait que la SFML est vraiment un plaisir à utiliser, ton travail est juste remarquable.
« Modifié: Décembre 16, 2014, 11:37:24 am par Niloc »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Shaders et rendus parallèlisés
« Réponse #3 le: Décembre 16, 2014, 11:39:41 am »
Les coeurs d'un GPU sont totalement différents des coeurs d'un CPU. Les 384 coeurs dont tu parles sont des unités de traitement internes, à mon avis ils sont utilisés pour paralléliser le traitement des pixels pour un unique shader (càd que si tu as un buffer de 1024x768, donc 786432 pixels, il ne faudra que 2048 "cycles" pour exécuter un shader sur la totalité du buffer).

Mais en aucun cas tu ne pourras exécuter plusieurs morceaux d'OpenGL indépendants en parallèle. OpenGL, le driver, le bus physique et le point d'entrée de ton GPU sont tous mono-thread. Ce n'est qu'en interne du GPU que le travail est dispatché entre les différentes unités de calcul, à un niveau beaucoup plus bas.

Là tu t'égares dans une direction qui ne donnera rien, ne perd pas ton temps avec ça.
Laurent Gomila - SFML developer

Niloc

  • Newbie
  • *
  • Messages: 3
    • Voir le profil
Re : Shaders et rendus parallèlisés
« Réponse #4 le: Décembre 16, 2014, 11:46:07 am »
Très bien !
Je te remercie pour la rapidité de tes réponses et pour m'avoir épargné de bien nombreuses heures de boulot inutiles...
Je vais devoir chercher des solutions alternatives donc. Merci !