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 : Affichage Texture


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 9
    Par défaut GLSL : Affichage Texture
    Bonjour,

    En quelques mots :
    objectif : afficher le carré de la différence entre deux textures appliquées sur un carré.
    choix : utiliser les shaders (GLSL)

    problème : on n'arrive pas à afficher (tout blanc)

    main source :
    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
     
    GLuint		texture[2]; // les deux textures
     
    setShaders(){
     
            char *vs = NULL,*fs = NULL,*fs2 = NULL;
     
    	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    	glLoadIdentity();
     
    	glBegin(GL_QUADS);
    		glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);	// Bottom Left Of The Texture and Quad
    		glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);	// Bottom Right Of The Texture and Quad
    		glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f,  1.0f);	// Top Right Of The Texture and Quad
    		glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f,  1.0f);	// Top Left Of The Texture and Quad
    	glEnd();
     
     
    	v = glCreateShader(GL_VERTEX_SHADER);
    	f = glCreateShader(GL_FRAGMENT_SHADER);
    	f2 = glCreateShader(GL_FRAGMENT_SHADER);
     
    	vs = textFileRead("diff_img.vert");
    	fs = textFileRead("diff_img.frag");
     
    	const char * vv = vs;
    	const char * ff = fs;
     
    	glShaderSource(v, 1, &vv,NULL);
    	glShaderSource(f, 1, &ff,NULL);
     
    	free(vs);free(fs);
     
    	glCompileShader(v);
    	glCompileShader(f);
     
    	p = glCreateProgram();
    	glAttachShader(p,v);
    	glAttachShader(p,f);
     
    	glLinkProgram(p);
     
    	glUseProgram(p);
     
    	GLint loc1, loc2;
    	loc1 = glGetUniformLocation(p,"text1");
    	glUniform1i(loc1, texture[0]);
    	loc2 = glGetUniformLocation(p,"text2");
    	glUniform1i(loc2, texture[1]);
     
    	glutSwapBuffers();
    }
     
    void main(int argc,char **argv)
    {
     
    	glutInit(&argc,argv);
    	//[...]
     
    	GLenum err = glewInit();
     
    	glutCreateWindow("diff");
    	glutDisplayFunc(setShaders);
     
    	glutMainLoop();
     
    }
    fragment shader :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    uniform sampler2D text1, text2;
     
    void main()
    {
    	vec4 texval1;
    	vec4 texval2;
     
    	texval1 = texture2D(text1, vec2(gl_TexCoord[0]);
    	texval2 = texture2D(text2, vec2(gl_TexCoord[1]);
     
    	gl_FragColor = 0.5*(texval + texval2); // moyenne dans un premier temps
    }

  2. #2
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 9
    Par défaut
    Merci d'avance !
    (désolé pour le code, un peu long et sans doute faux ^^, mais comma ça y'a à peu près tout pour cerner le problème, enfin on espère !)

    Aymeric et Pierre, boulets

  3. #3
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Comme je l'avais expliqué, ce n'est pas l'identifiant de texture qu'il faut passer à glUniform1i, mais l'unité sur laquelle la texture est bindée (donc ici très probablement 0 et 1). Pour binder sur autre chose que l'unité 0, utiliser glActiveTexture.

  4. #4
    Membre Expert
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 573
    Par défaut
    je ne vois pas de glEnable(GL_TEXTURE_2D)
    tu ne l'as pas oublié au moins ?
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  5. #5
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Et juste comme ça... Ca sert à rien de recharger complétement le shader à chaque frame. Et mieux vaut l'activer avant d'envoyer ta géometrie, sinon ça n'aura pas beaucoup d'effet

  6. #6
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 9
    Par défaut
    Bonjour,

    Merci pour vos réponses.
    Nous avons finalement réussi à obtenir ce que nous voulions.
    On ne faisait en effet pas exactement ce qu'il fallait (pas dans le bon ordre, quelques oublis...).

    Voici un petit lien qui offre un exemple de multitexture avec des shaders (code source complet dispo, avec quelques commentaires) :
    http://www.cs.cmu.edu/afs/cs/academi...6s/notes/glsl/

    Nous allons maintenant tenter de faire la somme des pixels de cette image (texture) différentielle afin d'obtenir une erreur globale... bref, y'a encore du boulot ! (il n'y aurait pas une fonction toute faite qui existe pour cela par hazard?!)

    Merci encore !

    Aymeric et Pierre

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 08/06/2009, 11h30
  2. [ GLSL ] et textures (débutant)
    Par scannerz57 dans le forum OpenGL
    Réponses: 2
    Dernier message: 24/12/2008, 14h01
  3. Réponses: 3
    Dernier message: 31/07/2008, 17h54
  4. Réponses: 2
    Dernier message: 29/02/2008, 15h59
  5. [obj][irrSpintz] affichage texture
    Par Husqvarna dans le forum Irrlicht
    Réponses: 2
    Dernier message: 15/05/2006, 19h29

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