Auteur Sujet: Closures et pointeurs de fonctions en HLSL  (Lu 392 fois)

0 Membres et 1 Invité sur ce sujet

Hors ligne @lx

    • Pouet.net
    • Voir le profil
    • Code4k
  • Ancienneté: 1989
  • Groupe: FRequency
  • Rôle: code (+musique), web
  • Ville: Tokyo
Closures et pointeurs de fonctions en HLSL
« le: 25 Novembre 2011 à 02:42:45 »
Ola!  :)
J'ai posté un article sur mon blog qui explique comment hacker HLSL pour développer du code qui supporte les closures et les pointeurs de fonctions  en HLSL : "Advanced HLSL using closures and function pointers"

L’intérêt essentiel de ce genre de technique est de permettre la réutilisation et l'abstraction de code, une grosse faiblesse des langages de shaders actuels (HLSL, GLSL)...
« Modifié: 25 Novembre 2011 à 04:02:32 par @lx »

Hors ligne Patapom

    • Voir le profil
    • www.patapom.com
  • Ancienneté: 1988
  • Groupe: Bomb!
  • Rôle: Coder
  • Ville: Lyon
Re : Closures et pointeurs de fonctions en HLSL
« Réponse #1 le: 25 Novembre 2011 à 15:18:18 »
Ca a l'air très sympa... Je t'avouerais que j'ai pas tout compris vu que j'ai lu ça en diagonale à 5h du matin mais bon. ;D
Déjà, j'étais surpris de voir qu'on pouvait créer des classes et des interfaces en HLSL !!! :o

Tu peux donner des exemples d'utilisations possibles qui donneraient envie d'utiliser des interfaces ? (hormis l'exemple du noise multi-formes, que je trouve sympa mais p'têt un peu limité)

J'utilise déjà une sorte de notion d'interface via les semantics, mais c'est uniquement une "interface" C++ / HLSL. Là tu parles d'interchanger des bouts de code... Je crois pas en avoir eu souvent l'utilité, mais p'têt que je l'ai jamais fait parce que je pensais que c'était impossible...
.  Pom  .

Hors ligne u2Popsy

    • Voir le profil
    • u2 Blog
  • Ancienneté: 1996
  • Groupe: PoPsY TeAm
  • Rôle: coder
  • Ville: Lyon
Re : Closures et pointeurs de fonctions en HLSL
« Réponse #2 le: 25 Novembre 2011 à 18:49:07 »
Hello @lex j'ai regardé ton post en diagonale aussi  ( entre 2 compile )  mais ca semble  pas mal.

Pour parlé de mon expérience sur le sujet de code réutilisable hlsl j'utilise pour ma part pas mal le systeme de MACRO enrichit par du C++. C'est a dire que j'utilise l'interface de compilation du shader HLSL pour setter des macros que j'ai au préalable définit. C'est pratique car au runtime je peux setter certaines infos / Datas sur un même shader sans avoir besoin de le recoder. J'ai ai eut besoin notamment car je compile des shaders pour DX9 / 10 etc.. et qu'il faut émuler certaine fonctions en DX9  qui sont présentent en DX10 ( récupération de la taille d'une  texture par exemple ).
Je me suis fait aussi un system de templates  qui va concaténer les parties de shaders en fonction des besoins ( util pour mon rendu de primitive 2D qui utilise des effets de brush différents ( [Rectangle,sphere, ligne..] / [lineargradient, solid color, radialgradiant..]  ) finalement ca marche bien et pas trop contraignant. Par contre il faut avoir un pipeline bien définit pour les shaders afin que cela soit util.

Hors ligne ponce

    • Pouet.net
    • Coup de coeur
    • Voir le profil
    • Games from mars
  • Ancienneté: 2009
  • Groupe: aucun
  • Rôle: code
Re : Closures et pointeurs de fonctions en HLSL
« Réponse #3 le: 25 Novembre 2011 à 18:53:42 »
Note: Derrière le nom "closure" se cache à la fois les "full closures" qui peuvent sauvegarder l'environnement quelque part pour être appelée quand celui-ci à été détruit, et un "static link" qui permet à une classe d'accéder à cet environnement avec une durée limitée.
Ici c'est un lien statique.

Hors ligne @lx

    • Pouet.net
    • Voir le profil
    • Code4k
  • Ancienneté: 1989
  • Groupe: FRequency
  • Rôle: code (+musique), web
  • Ville: Tokyo
Re : Closures et pointeurs de fonctions en HLSL
« Réponse #4 le: 25 Novembre 2011 à 23:37:40 »
Tu peux donner des exemples d'utilisations possibles qui donneraient envie d'utiliser des interfaces ? (hormis l'exemple du noise multi-formes, que je trouve sympa mais p'têt un peu limité)
Il y a deux choses dans mon article: 1) Les functions pointers  et 2) les closures.

Pour 1), c'est le cas le plus conventionel:
A chaque fois que tu as du code que tu veux pouvoir moduler en compilant des version plus optimales, ou tu veux modifier le comportement d'un code.
Je prends par exemple le cas du calcul du filtering d'une shadow map: tu peux vouloir utiliser en bout de chaîne du PCF ou du VSM. Dans le cas classique, tu es obligé de faire de la tambouille avec des includes/defines (un peu comme ce qu'explique u2) pour inliner du code:
Typiquement, tu as d'habitude un code suivant:

void BigFunction() {
    ...

    // ... Beaucoup de code

    // USE_PCF est une macro: On peut changer le code
   // a l'interieur de BigFunction, a condition de faire une double compilation
   // de ce fichier en settant la macro USE_PCF
   float fliterFactor;
   if (USE_PCF)
       fliterFactor = FilterPCF(pos, depth);
   else
       fliterFactor = FilterVSM(pos, depth);

    // ... Beaucoup de code
}

Mais tu peux faire ça de manière plus élégante avec les functions pointers (en fait, la c'est même plus, puisque tu peux utiliser tout la richesse des interfaces/classes), sans a avoir bidouiller ton code avec des macros:

void BigFunction(IShadowFilter filter ) {
    ...

    // ... Beaucoup de code

   // Utilisation de l'interface pour effectuer le sous calcul.
   float fliterFactor = filter.Compute(pos, depth);

    // ... Beaucoup de code
}

Tu as d'autres cas d'utilisations: Par exemple, du raymarching avec des fonctions iso interchangeables. L'algo de raymarching, en prenant en compte toutes ses composantes (raymarching, calcul de normale, calcul d'AO...etc.) est très simple mais il devient tout de suite un peu laborieux si tu veux changer la fonction iso facilement (qui se retrouve utilise a plusieurs endroits, pour le calcul du raymarching, pour le calcul de la normale...etc.). Avec les interfaces/classes, tu peux arriver a rendre ton code un peu plus pluggable.

Pour 2), le cas d'utilisation se limite pour ma part a une chose: Lorsque tu veux pouvoir chaîner des appels d'interfaces (A -> B -> C), tout en rendant la chose configurable de l'exterieur (Dans le cas a A->B->C, tu ne veux pas a avoir passer l'instance C par paramètre a A pour qu'il la fasse transiter a B...). C'est le cas de la composition de noise dans mon exemple.

La solution classique serait de définir une variable d'instance de ces classes, mais HLSL n'autorise malheureusement pas les interfaces comme membres d'une classes, donc je suis passé par ce hack de closure qui permet de plugger le code a plusieurs etages (dans l'exemple precedant, c'est comme si IShadowFilter voulait aussi utiliser un code interchangeable, sans que tu ai a passer le code via les parametres de la fonction BigFunction, je sais pas si tu me comprends la!)

Note: Derrière le nom "closure" se cache à la fois les "full closures" qui peuvent sauvegarder l'environnement quelque part pour être appelée quand celui-ci à été détruit, et un "static link" qui permet à une classe d'accéder à cet environnement avec une durée limitée.
Ici c'est un lien statique.
En fait, pas exactement, car on peut faire un peu des deux. ;) J'ai par exemple utilisé ce code la:

    static INoise New(INoise from) {
        class LocalNoise : AbsNoise { INoise Next() { return from; } } noise;
        return noise;
    }

La variable from est locale a New (on pourrait rajouter aussi des variables internes dans New) mais l'instance de INoise a une duree de vie en dehors de la fonction New.
Mais c'est simplement parceque derrière, comme le code d'un shader n'est au final qu'inliné par le compilo, ça revient a la fin a une sorte de "static link"!

Hors ligne ponce

    • Pouet.net
    • Coup de coeur
    • Voir le profil
    • Games from mars
  • Ancienneté: 2009
  • Groupe: aucun
  • Rôle: code
Re : Closures et pointeurs de fonctions en HLSL
« Réponse #5 le: 26 Novembre 2011 à 03:46:56 »
Ah ok j'ai rien dit, on dirait bien une full closure.

Hors ligne Patapom

    • Voir le profil
    • www.patapom.com
  • Ancienneté: 1988
  • Groupe: Bomb!
  • Rôle: Coder
  • Ville: Lyon
Re : Closures et pointeurs de fonctions en HLSL
« Réponse #6 le: 26 Novembre 2011 à 10:27:39 »
A ne pas confondre avec http://www.imdb.com/title/tt1374884/ ;D
.  Pom  .

 

Dans la Réponse Rapide, vous pouvez utiliser du BBCode et des smileys comme sur un message normal, mais à partir d'une interface plus rapide d'accès.

Attention, il n'y a pas eu de réponse à ce sujet depuis au moins 30 jours.
À moins que vous ne soyez sûr de vouloir répondre, pensez éventuellement à créer un nouveau sujet.

Nom: E-mail:
Vérification:
Quel est la couleur du cheval rouge d'Henri IV ?: