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 :

OpenGL ES 2.0 : Optimisation du passage des uniforms


Sujet :

OpenGL

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 25
    Par défaut OpenGL ES 2.0 : Optimisation du passage des uniforms
    Bonjour,

    Je programme pour Android j'utilise OpenGL ES 2.0 et j'ai quelques questions concernant l'optimisation :
    1- OpenGL ES 2.0 n'a pas d’attribut prédéfini, donc pas de gl_ModelViewMatrix, il faut faire passer ça en uniform. Mais un programme n'utilise pas qu'un seul shader, ma question est donc, comment faire passer ma ModelViewMatrix et mes Lights à tout les shaders sans appeler glUniformMatrix4fv autant de fois que j'ai de shaders ?

    2- Comment connaitre la taille de la mémoire GPU que l'on possède ?

    3- Le pipeline par défaut, il peut rien faire ?

    Merci pour vos réponses.

  2. #2
    Membre averti
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Octobre 2011
    Messages : 17
    Par défaut
    Citation Envoyé par Robert Dumarais Voir le message
    Bonjour,

    Je programme pour Android j'utilise OpenGL ES 2.0 et j'ai quelques questions concernant l'optimisation :
    1- OpenGL ES 2.0 n'a pas d’attribut prédéfini, donc pas de gl_ModelViewMatrix, il faut faire passer ça en uniform. Mais un programme n'utilise pas qu'un seul shader, ma question est donc, comment faire passer ma ModelViewMatrix et mes Lights à tout les shaders sans appeler glUniformMatrix4fv autant de fois que j'ai de shaders ?
    Pour les autres points je ne pourrais pas te répondre, mais pour celui-la en revanche, le fait de passer la matrice modelview au shader se fait en général pour chaque shader différent, y compris sur les versions plus anciennes d'opengl (bon c'est pas non plus obligatoire mais dans le cas general, quand tu changes de shader y a peu de chance que tu réutilise la modelview précédente, sauf cas particuliers). Tu te retrouvais donc également a devoir faire un glLoadMatrix() avant de faire le rendu de ton objet, ce qui en terme de cout équivaut a envoyer une variable uniforme a chaque shader (bon certes y a des cas particuliers ou tu peux rendre le meme objet plusieurs fois de suite avec la meme modelview mais un shader different, m'enfin ca doit pas representer la grande majorité des cas, et meme en supposant que oui ce genre d’opération est vraiment minime et ça ne changera rien au niveau des perfs).

  3. #3
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Salut

    Alors, si, il y a pleins de techniques qui utilisent le multi pass rendering avec les mêmes uniforms mais des shaders différents. Mais ce n'est pas des techniques de base

    1. Comme dit wperrad, glLoadMatrix ou les uniforms, même résultat, les données doivent être renvoyé. Sauf qu'avec glLoadMatrix, on le voit pas trop. C'est une des raisons de ce changement d'ailleurs (mieux voir ce qui se passe). Et c'était le premier pas vers la suite : mieux contrôler ce qui se passe, pour éviter les pertes de perfmances

    Petite remarque, les uniforms sont attachés à un programme, pas un shader. Donc disponible dans tous les shaders d'un programme.

    Pour aller plus loin, il faut utiliser les uniform buffer object, qui sont persistants en mémoire gpu et peuvent être partagés entre programmes

    2. Bonne question... perso, j'utilise CUDA (cudaGetDeviceProperties) ou OpenCL (clGetDeviceInfo). Avec OpenGL, je sais pas trop

    EDIT : rien dans le standard, a priori, faut juste tester si l'allocation des buffer réussit... Il existe des solutions vendeur-spécifiques, donc non recommandées. Avec la SDL SDL_VideoInfo, avec les extensions GL_ATI_meminfo pour AMD et GL_NVX_gpu_memory_info pour NVIDIA (voir How to get the GPU memory size and usage in OpenGL?)

    3. Plus de pipeline fixe dans OpenGL ES 2, donc non, il fait rien puisqu'il n'existe plus. La raison est que cela prenait de la place sur le GPU et est moins souple qu'un pipeline programmable

  4. #4
    Membre chevronné

    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    311
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 311
    Par défaut
    Bonjour

    glLoadMatrix n’existe pas en OpenGL ES 2.0 , tous comme les piles de matrices (MODELVIEW, PROJECTION et TEXTURE)

    Citation Envoyé par gbdivers
    il faut utiliser les uniform buffer object, qui sont persistants en mémoire gpu et peuvent être partagés entre programmes
    Egalement non présent en ES 2.0 … mais semble l’être en ES 3.0

    Citation Envoyé par Robert Dumarais
    Mais un programme n'utilise pas qu'un seul shader
    OpenGL ES 2.0 permet de lier à un programme que 2 type de Shader : le VertexShader et le PixelShader.
    je n’ai jamais cherché à attacher plusieurs VertexShader ou plusieurs PixelShader a même programme, pour moi un programme ne peut être constitué que d’un seul VertexShader et un seul PixelShader.

  5. #5
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    @p3ga5e
    Merci pour les précisions. Effectivement, je n'ai pas vérifié à partir de quel version était pris en charge les UBO

    Pour les shaders, sauf erreur de ma part, les règles sont :
    * pas deux shader de même type dans un programme
    * au minimum un vertex et un fragment shaders
    Donc pour GL ES 2, pas trop le choix, faut tout mettre. Pour GL, on a d'autres shaders

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 25
    Par défaut
    Merci pour vos réponses.
    Ma conception super propre pour opengl 1.0 devient un peu bancale mais j'avance.

    Edit:
    Bon donc du coup j'ai des questions qui me viennent en tête :

    J'appris qu'il faut faire un shader pour chaque cas (une seule texture / bump mapping) J'ai fait le compte de mes shaders et je me retrouve avec beaucoup de shader (animation + texture normal, animation + bump mapping, light + .... )

    Je vais prendre mon cas "d'animation" pour savoir à quel point c'est moche de :
    1- rajouter un uniform et une condition dans le shader pour dire s'il faut appliquer une animation ou pas ?
    2- tester la valeur de l'animation pour savoir si on l'applique ou pas ?
    3- l'appliquer de toute façon avec des valeurs identitaire ?

    Et surtout, es ce que je me prends pas la tête avec le passage des uniforms sachant qu'il doit être négligeable devant le nombre de vertices qu'on envoie au programme ?

Discussions similaires

  1. Optimisation du code des ordres SQL
    Par Titouf dans le forum Langage SQL
    Réponses: 1
    Dernier message: 14/08/2005, 22h08
  2. Réponses: 2
    Dernier message: 19/07/2005, 11h12
  3. [EJB] Passage des paramètres par référence
    Par salome dans le forum Java EE
    Réponses: 2
    Dernier message: 05/07/2005, 11h25
  4. Réponses: 2
    Dernier message: 11/05/2005, 13h23
  5. Passage des chaînes de caractères à une application CGI
    Par Thom@s dans le forum Composants VCL
    Réponses: 10
    Dernier message: 03/12/2004, 00h13

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