Where communities thrive


  • Join over 1.5M+ people
  • Join over 100K+ communities
  • Free without limits
  • Create your own community
People
Activity
    Jean-Michaël Celerier
    @jcelerier
    co tu peux mettre les gl_invocation.x et 0
    enfin l'index de la boucle
    et combiner avec par ex. l'uniform qui donne le temps
    (regarde la struct ProcessUBO dans le code C++, normalement elle est accessible depuis le compute shader)
    faut juste que tu sois bien conscient que le vrai aléatoire ça existe quasiment pas, 99.9% du temps le rand() c'est une fonction pseudo-aléatoire, c'est-à-dire "qui a une tête" d'aléatoire mais qui ne l'est pas vraiment
    (mais c'est très suffisant)
    Afourcadet
    @Afourcadet
    D'accord, j'utiliserais l'uniform qui donne le temps où dans cette ligne de code? J'ai un peu du mal à comprendre haha :sweat_smile:
    Jean-Michaël Celerier
    @jcelerier
    en gros
    si tu appelles la fonction rand() en C
    derrière dans la libc, ça pourrait être implémenté comme ça (très vite fait, juste pour donner l'idée):
      static int random_state{};
    
      void srand(int init) 
      { random_state = init; rand(); }
    
      int rand() { 
        /* opération compliquée sur random_state */
        random_state = (random_state * 123456481) % 576473;
        return random_state;
      }
    mais quand on est dans les shaders, ya pas de "state" préexistant, on est obligé de générer le random "à partir de rien"
    Jean-Michaël Celerier
    @jcelerier
    et on ne peut que implémenter la partie "calcul" : dans un shader le mieux qu'on puisse faire c'est cette partie là en gros
       int rand(int input) { return (input * 123456481) % 576473; }
    et c'est à nous de choisir ce qu'on met en entrée
    du coup l'idée c'est de mettre un truc qui va pas être 0
    mais qui va être différent pour chaque invocation du compute shader
    après la fonction "rand" s'occupe de faire en sorte que deux valeurs "proches" en entrée aient pas la même tête en sortie
    c'est-à-dire qu'on veut pas que rand(1) rand(2) rand(3) ça fasse qqch comme 14356039 14356040 14356041
    mais des valeurs bien réparties dans le "spectre" des entiers
    Afourcadet
    @Afourcadet
    donc le vec2 co sert de seed pour le random en fait?
    Jean-Michaël Celerier
    @jcelerier
    oui exactement
    enfin en général quand on parle de "seed" c'est la valeur de random "initiale"
    mais sur un shader y'a pas vraiment de seed parce qu'il faut recalculer le random à chaque fois
    l'important est que ce soit des valeurs assez distinctes entre tes particules
    Afourcadet
    @Afourcadet
    Mais je vois pas bien comment combiner vec2 co = {gl_invocation.x, 0} et l'uniform qui donne le temps
    Jean-Michaël Celerier
    @jcelerier
    par ex. juste faire "position.x + temps" ça va pas suffire
    parce que par exemple ça va te donner 1 pour : la particule 0 au temps 1, et la particule 1 au temps 0
    hm
    par contre {gl_invocation.x, temps}
    ça devrait ptet donner qqch
    Afourcadet
    @Afourcadet
    okay, je vois
    Afourcadet
    @Afourcadet
    Mais même si je sais que le struct ProcessUBO contient bien le champ que je veux, je ne vois pas où trouver l'uniform conrrespondant, je ne le vois utilisé ou specifié dans aucun des trois shaders
    Jean-Michaël Celerier
    @jcelerier
    ah
    layout(std140, binding = 1) uniform process_t {
      float time;
      float timeDelta;
      float progress;
    
      int passIndex;
      int frameIndex;
    
      vec4 date;
      vec4 mouse;
      vec4 channelTime;
    
      float sampleRate;
    };
    il devrait avoir cette tête
    (vérifie le binding dans le doute)
    tu peux rajouter ce code directement dans le compute shader je pense
    Afourcadet
    @Afourcadet
    Et il faut que j'ajoute l'uniform dans les bindings du coup
    Ou alors j'ai pas compris où était bindé m_processUBO dans le compute shader
    Afourcadet
    @Afourcadet
    Alors, je me suis arrangé (je crois), mais j'ai bien mis la fontion que tu m'as donné pour le rand et j'ai une erreur : Debug: "ERROR: :56: 'rand' : no matching overloaded function found \nERROR: :56: '' : compilation terminated \nERROR: 2 compilation errors. No code generated." (Utils:257)
    Jean-Michaël Celerier
    @jcelerier
    hgmmm
    hmm
    à quoi ressemble le code ?
    de ton shader
    Afourcadet
    @Afourcadet
    Alors, j'ai trouvé le souci oui, j'ai appelé rand(x,y) au lieu de rand(vec2(x,y)), my bad
    Jean-Michaël Celerier
    @jcelerier
    ah yes
    est-ce que ça donne un truc correct du coup ?
    Afourcadet
    @Afourcadet
    Oui ç'est largement utilisable tel quel
    D'ailleurs ce rand renvoi un résultat borné comment? Entre 0 et 1?
    Jean-Michaël Celerier
    @jcelerier
    je n'en ai aucune idée aha
    euh