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 :

shader : application de 2 shaders


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de ludo86
    Homme Profil pro
    Développement applications iOS/android
    Inscrit en
    Avril 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développement applications iOS/android
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 93
    Par défaut shader : application de 2 shaders
    Bonjour,

    Je voulais savoir comment faire pour appliquer 2 shaders l'un à la suite de l'autre.

    Voila la description en image :

    Effet phong


    Création des trou dans la boules :


    Ces 2 effets étant réalisés par 2 shaders différents.

    Dans mon code je ne sais pas malheureusement comment les combiner.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
     
    void Plateform::render() {
    	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    	glMatrixMode(GL_MODELVIEW);
     
    	glUseProgram(program);
    	float minR = glGetUniformLocation(program,"minRadius");
    	glUniform1f(minR,0.55);
     
    	glEnable(GL_ALPHA_TEST);
    	glAlphaFunc(GL_GREATER, 0.0f);
     
            glUseProgram(phongProgram);
    	int nbLight = glGetUniformLocation(phongProgram,"numLights");
    	glUniform1i(nbLight,1);	
     
     
    	glColor3f(1.0,0.0,0.0);
    	glMaterialfv(GL_FRONT, GL_AMBIENT, ambiantMt);
    	glMaterialfv(GL_FRONT, GL_DIFFUSE, diffuseMt);
    	glMaterialfv(GL_FRONT, GL_SPECULAR, specularMt);
    	glMaterialf(GL_FRONT, GL_SHININESS, 25.0);
    	glPushMatrix();
    		//glTranslatef(0.0,0.0,0.0);
    		gluSphere(openGLSphere,1.0,24,24);
    	glPopMatrix();
     
    	glUseProgram(0);
     
    	glColor3f(1.0,1.0,1.0);
    	/*glPushMatrix();
    		//glTranslatef(0.0,0.0,0.0);
    		gluSphere(openGLSphere,0.3,24,24);
    	glPopMatrix();*/
     
    	/* Dessin du sprite avec transparence */
    	glDisable(GL_ALPHA_TEST);
    	glColor3f(1.0,1.0,1.0);
    	glutSwapBuffers();
    	glutPostRedisplay();
    }

  2. #2
    Membre éprouvé Avatar de Robxley
    Homme Profil pro
    Docteur ingénieur traitement d'image
    Inscrit en
    Mai 2009
    Messages
    158
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Docteur ingénieur traitement d'image

    Informations forums :
    Inscription : Mai 2009
    Messages : 158
    Par défaut
    Salut,


    Opengl marchant sur le principe du "bindage", il n'est pas possible d'effectuer successivement des effets appelés par plusieurs "bindage" différents sur un même type d'objet (texture, shader, fbo...). Seule le dernier "bindage" sera pris en compte pour les formes dessinés par la suite. Les shaders n'échappent pas à la règle.
    Ouaip, je suis peut être pas très claire.

    Un petit exemple. Texture, couleur, shader, vbo, fbo... marche avec le principe du "bindage", le dernier appelé est le seul et unique actif pour l'ensemble des dessins suivants leur déclaration.

    ex1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    glBindTexture(GL_TEXTURE_2D, texture1); //ne sert à rien
    glBindTexture(GL_TEXTURE_2D, texture2); //texture "bindée" et prise en compte pr la suite des objets dessinés
    maSuperScene();
    glFlush();
    le code de l'ex1 est équivalent à l'ex2 (ex1 est moins rapide cependant par le bindage de texture1 inutile)
    ex2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    glBindTexture(GL_TEXTURE_2D, texture2);
    maSuperScene();
    glFlush();
    C'est exactement pareil avec les shaders.
    Le fait de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    glUseProgram(program);
    ... //definition des uniforms machin chose, mais pas de dessin opengl
    glUseProgram(phongProgram);
    donnera exactement le même résultat que si tu avais fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    glUseProgram(phongProgram);
    L'effet de program ne sera pas effectué.


    Donc pour répondre à ta question, si tu souhaites effectuer deux effets GLSL sur le même objet, le plus simple dans ton cas c'est de les regrouper dans un même est unique program.

    Cependant pour des effets plus complexes, il existe d'autres méthodes qui consistent à effectuer une premier partie des calculs d'un effet avec un premier shader et enregistrer les résultats dans des textures intermédiaires (à l'aide de FBO par exemple) pour ensuite se servir de ces textures intermédiaires dans le 2nd shader.
    Mais bon ca rajoute de la complexité au programme et demande de faire ça en plusieurs "pass" donc souvent moins rapide. Pour des effets relativement simples comme le tien tout regrouper dans un seul et même program GLSL me semble beaucoup plus simple et approprié.

  3. #3
    Membre confirmé Avatar de ludo86
    Homme Profil pro
    Développement applications iOS/android
    Inscrit en
    Avril 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développement applications iOS/android
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 93
    Par défaut
    Merci pour cette réponse. En effet tout marche mieux maintenant!!!

  4. #4
    Membre confirmé Avatar de ludo86
    Homme Profil pro
    Développement applications iOS/android
    Inscrit en
    Avril 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développement applications iOS/android
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 93
    Par défaut
    Voilà un petit aperçu


  5. #5
    Membre éprouvé Avatar de Robxley
    Homme Profil pro
    Docteur ingénieur traitement d'image
    Inscrit en
    Mai 2009
    Messages
    158
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Docteur ingénieur traitement d'image

    Informations forums :
    Inscription : Mai 2009
    Messages : 158
    Par défaut
    Nickel, content d'avoir pu t'aider.

    bonne continuation.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Firefox 27 intègre un éditeur de shaders pour les applications WebGL
    Par LittleWhite dans le forum Développement 2D, 3D et Jeux
    Réponses: 1
    Dernier message: 25/11/2013, 09h37
  2. Réponses: 31
    Dernier message: 10/08/2008, 14h04
  3. [Shader - glew] versions des shader
    Par akiraa dans le forum OpenGL
    Réponses: 11
    Dernier message: 21/08/2007, 11h43
  4. carte graphique et pixels shader
    Par yeeep dans le forum DirectX
    Réponses: 2
    Dernier message: 26/04/2003, 10h54

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