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 :

[GLSL] shader et sampler2D


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    216
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 216
    Par défaut [GLSL] shader et sampler2D
    Bonjour,

    Je suis entrain de faire un éclairage par pixel et j'aimerais avoir le choix pour mes matériaux entre choisir une couleur spéculaire ou utiliser une texture spéculaire.

    Voici ce que je fait quand j'active mon matériaux pour un modèle 3D :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    glActiveTextureARB(GL_TEXTURE1_ARB);
    if(specularTexture)
    {
    	glBindTexture(GL_TEXTURE_2D, specularTexture->getTextureID());
    }else
    { //pas de texture spéculaire donc on utilise une couleur spéculaire
    	glBindTexture(GL_TEXTURE_2D, 0);
    	glMaterialfv(GL_FRONT, GL_SPECULAR, (float *)specularColor);
    }
    glMaterialf(GL_FRONT, GL_SHININESS, shininess);
    glActiveTextureARB(GL_TEXTURE0_ARB);
    Donc dans mon shader je doit utiliser une des 2 lignes de code suivante en fonction de si j'utilise une texture pour le spéculaire ou une bête couleur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    color += att * gl_FrontMaterial.specular * Lspecular * pow(NdotHV, gl_FrontMaterial.shininess);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    color += att * texture2D(specularTexture, gl_TexCoord[0].st) * Lspecular * pow(NdotHV, gl_FrontMaterial.shininess);
    Mais quel condition doit-je mettre pour exécuter la bonne ligne ? Y a-t-il moyen de savoir si la texture 'bindé' vaut 0 ou une autre valeur ?

    merci

  2. #2
    Membre éclairé
    Homme Profil pro
    Game Graphics Programmer
    Inscrit en
    Août 2006
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Game Graphics Programmer
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 408
    Par défaut
    Citation Envoyé par casafa Voir le message
    Y a-t-il moyen de savoir si la texture 'bindé' vaut 0 ou une autre valeur ?
    Envoyer le GLuint ID de la texture bindé en tant que uniform au shader serait une solution...

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    216
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 216
    Par défaut
    Oui en effet c'est une solution...

    Mais:
    1) Si il y a plus simple, je suis preneur
    Si je fait : texture2D(specularTexture, gl_TexCoord[0].st) et que je n'ait aucune texture de bindé : qu'est ce qui se passe ?
    Edit: même pas le temps de poser la question que l'ont me répond déjà

    2) Niveau performance : est-ce rapide d'envoyer un 'uniform' à chaque frame ?

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 366
    Par défaut
    Citation Envoyé par casafa Voir le message

    2) Niveau performance : est-ce rapide d'envoyer un 'uniform' à chaque frame ?
    cout quasi inexistant ... effectivement il vaut mieux eviter d en changer 10 milliards de fois, mais comme ca une fois par passe c'est rien du tout (d ailleurs tous les shaders possèdent des uniforms)

    Par ailleurs, je suis persuade que que tu ecrits quelquechose comme gl_ModelViewMatrix c'est deja une transmission d uniform un peu cachee

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    216
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 216
    Par défaut
    merci bien pour vos réponses, je croit que je vais créer une texture de 1x1.

    Par contre je vient tout juste de lire quelques choses sur un forum à propos des fragment shader et ça m'as assez impressionné, tout du moins ceci :

    Quand dans ton code tu as un "if test then code a else code b end", en terme de compilation tu as le code a à un endroit, le code b à un autre, et après le test, tu ajoutes une entrée à la pile, et saute, comme pour un appel de fonction. Le problème pour la GPU est que tu n'as pas de pile. Donc la façon dont tout est implémenté est la suivante : les DEUX parties sont exécutées, et seules les affectations en mémoire sont changées ensuite, avec le résultat du bon code. Du coup, faire un "if" dans un shader est dramatiquement inefficace. De plus, si les deux codes a et b ne sont pas similaires en terme d'opérations, tu perds beaucoup d'efficacité.
    Ma question : est-ce vrai ? n'a t-on pas trouvé de solution pour se problème d'optimisation ?

    Pour ceux que ça interresse, voici le poste en entier (il dit aussi que parce que il n'y a pas de pile, toutes les fonctions sont en inline) :
    http://www.linuxgraphic.org/forums/viewtopic.php?t=3956

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 366
    Par défaut
    reponse partielle : pour le cas du "if then else" .. il me semble que ca fait partie des specifications du shader model 3.0

    auparavant, si on voulait faire quelque chose comme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if (a) then
     
      x = y
     
    else
     
      x = z
     
    end
    on faisait quelque chose, comme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      x = (a * y) + (a - 1) * z
    donc on calculait a la fois y et z (meme si les compilateurs de shaders pouvaient admettre le mot cle if)

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 366
    Par défaut
    deux idees :

    - n utiliser que des textures ... avec une texture 1x1 pour la couleur speculaire

    - faire quelque chose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
      uniform float coef;
     
      vec4 tex_spec = texture2D(specularTexture, gl_TexCoord[0].st);
     
      vec4 col_spec = gl_FrontMaterial.specular;
     
      color += att * mix(tex_spec,col_spec,my_coef) ...
    De memoire, si tu tentes une lecture d une texture non bindee alors le pixel recu doit etre noir , mais la lecture est qd meme possible (bien que toute fictive finalement)

Discussions similaires

  1. [GLSL] infographie glsl (shader)
    Par anisklioui dans le forum OpenGL
    Réponses: 1
    Dernier message: 29/04/2015, 10h17
  2. GLScene GLSL Shader
    Par hey_monkey dans le forum Delphi
    Réponses: 0
    Dernier message: 15/07/2012, 19h18
  3. Ogre GLSL Shaders
    Par aigle_07 dans le forum Ogre
    Réponses: 6
    Dernier message: 06/01/2010, 20h21
  4. GLSL Shaders displacement
    Par xtra.creativity dans le forum OpenGL
    Réponses: 26
    Dernier message: 11/04/2007, 17h20
  5. Réponses: 2
    Dernier message: 05/07/2006, 12h09

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