IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

OpenGL Discussion :

Gérer les shaders "proprement"


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2012
    Messages : 4
    Par défaut Gérer les shaders "proprement"
    Bonjour!

    Alors voilà, je suis en train de coder un moteur de jeu, et j'ai réalisé tout à l'heure que ce qui me bloque vraiment est en fait de trouver un moyen efficace de rajouter des fonctionnalités pour l'affichage selon les envies du designer. Vous l'aurez peut-être compris, il s'agit de la gestion des Shaders.

    Par exemple, je me vois mal créer un shader pour quand la scène contient 1-2-3 lumières. Je pourrais faire un tableau de lumières dedans et modifier ce nombre au début avant la compilation du shader. Mais après, si je veux modifier les textures et les lumières, il me faudra à chaque fois modifier et recompiler le shader... N'y aurait-il pas un moyen plus productif si l'on excepte de retourner à la "fixed pipeline"?

    Il faut savoir que je bosse en Java avec la LWJGL, donc je suis du genre à éviter de faire des appels multiples à glUniformBlahBlah.(ce qui est de toute façon le cas aussi avec Qt, vu que glew ne veut pas fonctionner du tout pour je ne sais quelle raison)

    Merci d'avance pour avoir pris le temps de me lire et qui sait, peut-être, de me répondre,
    Cordialement,
    Maxime

  2. #2
    Modérateur
    Avatar de wax78
    Homme Profil pro
    R&D - Palefrenier programmeur
    Inscrit en
    Août 2006
    Messages
    4 097
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : R&D - Palefrenier programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 097
    Par défaut
    Citation Envoyé par hilaia Voir le message
    Il faut savoir que je bosse en Java avec la LWJGL, donc je suis du genre à éviter de faire des appels multiples à glUniformBlahBlah.(ce qui est de toute façon le cas aussi avec Qt, vu que glew ne veut pas fonctionner du tout pour je ne sais quelle raison)
    Je doute fort que tu ne saches le faire rapidement sans utilise glUniform... mais peut être ais-je tort. LWJGL ou pas
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2012
    Messages : 4
    Par défaut
    Oui ça c'est sûr, je ne veux pas les éviter totalement mais en faire le moins possible. Par ailleurs, j'aurais aimé savoir quand les variables sont communes entre différents shaders(ça arrive assez souvent, c'est rien que pour les attributs qui ont des places en mémoire relativement simples?)

    Merci pour votre attention

  4. #4
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 033
    Billets dans le blog
    12
    Par défaut
    A part si tu veux effectivement écrire un shader par matériau - en supposant qu'un matériau n'est visible qu'à un seul endroit de la scène, avec un nombre déterminé et immuable de lumières - tu seras obligé de passer par les glUniformXXX.
    Le passage par ces fonctions te permettra d'avoir un shader par type de rendu (rendu "normal", bump/normal mapping, relief mapping, post-FX, ...)
    Pour mon moteur, j'ai tout un set de variables uniform prédéfinies par le moteur. Ces variables contiennent entre autres les informations de matériau (ambient, emissive, shininess, specular, diffuse) et les informations des lumières (stockées dans une texture). A partir de là je peux, avec un même shader, rendre des objets situés dans des scènes complètement différentes. On appelle ça la réutilisabilité du code .

    Pour ta 2ème question, il n'y a qu'en OpenGL 2.x qu'il existe des variable "attribute"communes. C'était couplé avec les fonctions glVertexPointer, glColorPointer, ... qui permettaient d'utiliser dans un shader les variables glVertex, glColor.
    Ces fonctions étant dépréciées en 3.X, on utilise maintenant glVertexAttribPointer, qui elle prend le nom de la variable concernée par le buffer donné.

    En conclusion, c'est à toi de définir les variables "communes" entre différents shaders (seuls les noms seront communs). Par exemple j'ai comme noms de varaibles uniform "c3d_v4MatAmbient", "c3d_iLightsCount"...
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  5. #5
    screetch
    Invité(e)
    Par défaut
    il faudrait alors travailler avec les Constant Buffers (DirectX) ou Uniform Buffer Object (OpenGL)
    (http://www.jotschi.de/?p=427)
    je vois bien quelque chose du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    struct LightInfo
    {
       vec3 position;
       vec3 direction;
       vec3 color;
       float angle;
    };
    layout(std140) uniform lightBuffer
    {
    int nbLights; //entre 0 et 10
    LightInfo lights[10];
    };

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2012
    Messages : 4
    Par défaut
    Aaah, super les gars, merci.

    J'avais oublié que j'avais déjà lu quelque chose sur les textures pour les lumières.

    Et je pensais surtout aux variable uniform, pas attribute, quand je parlais de variables "dupliquées" dans des shaders, vu que j'utilise également glVertexAttribPointer. Je sais pas y'a des trucs bizarres des fois quand on fait pas glUniformXX à chaque changement de shader.

    @screetch: là ce que j'aime moins c'est le fait d'avoir un nombre "cappé" de lumières... dans une texture(paramétrées en GL_NEAREST) je me vois bien mettre l'inverse du nombre en (0, 0) et faire un for jusqu'à atteindre 1.(grossièrement, je vais me documenter pour que ça reste performant))
    Mais je vais quand même jeter un coup d'oeil .

    Merci à vous!

Discussions similaires

  1. Gérer les single quotes en PL/SQL
    Par paidge dans le forum Contribuez
    Réponses: 8
    Dernier message: 16/11/2012, 09h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo