Bonjour, je suis entrain de suivre un tuto sur les shaders et je suis déjà bloqué : J'essaie de récupérer l'id d'une variable globale de mon vertex shader avec glGetUniformLocation() mais quoi que je fasse, cette variable renvoie -1. Pourtant, mon programme est bien rattaché à mes shaders, il n'y a aucune erreur de compilation GLSL et le nom de ma variable est bien envoyé à glGetUniformLocation(), c'est un copier-coller !
Voici mon main côté OpenGL :
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 int main(int argc,char *argv[]) { SDL_Event evenement; GLuint programShader; if(SDL_Init(SDL_INIT_VIDEO)<0) return 0; putenv("SDL_VIDEO_CENTERED=1"); SDL_SetVideoMode(800,600,32,SDL_OPENGL); if(glewInit()!=GLEW_OK) { printf("Erreur initialisation GLEW, presser une toucher pour quitter"); getch(); SDL_Quit(); return 0; } programShader=chargeShaders(); //Chargement shaders if(programShader==0) //En cas d'erreur de chargement ou de compilation { SDL_Quit(); return 0; } GLint varShader=glGetUniformLocation(programShader,"variable"); printf("%d\n",varShader); //Ici ça m'affiche sans cesse -1 while(1) { SDL_PollEvent(&evenement); if(evenement.type==SDL_QUIT) break; //glUniform3f(varShader,0.5,1.2,2.4); SDL_GL_SwapBuffers(); glFlush(); } SDL_Quit(); return 0; }
Voici la fonction chargeShaders() :
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 GLuint chargeShaders(void) { char *vertexSource; char *fragmentSource; GLuint vertexShader; GLuint fragmentShader; GLuint programID; int vertexSize; int fragmentSize; vertexSource=lectureFichierShader("InitShaders/simple.vert"); if(vertexSource==NULL) return 0; fragmentSource=lectureFichierShader("InitShaders/simple.frag"); if(fragmentSource==NULL) return 0; vertexShader=glCreateShader(GL_VERTEX_SHADER); //Création shaders fragmentShader=glCreateShader(GL_FRAGMENT_SHADER); if(vertexShader==0) { printf("Erreur creation vertex shader, presser une touche pour quitter"); getch(); return 0; } if(fragmentShader==0) { printf("Erreur creation fragment shader, presser une touche pour quitter"); getch(); return 0; } glShaderSource(vertexShader,1,&vertexSource,NULL); glShaderSource(fragmentShader,1,&fragmentSource,NULL); free(vertexSource); free(fragmentSource); glCompileShader(vertexShader); glCompileShader(fragmentShader); if(!verifCompilShader(vertexShader)) return 0; if(!verifCompilShader(fragmentShader)) return 0; programID=glCreateProgram(); glAttachShader(programID,vertexShader); glAttachShader(programID,fragmentShader); //Liens shaders glLinkProgram(programID); if(!verifLiage(programID)) return 0; glUseProgram(programID); return programID; }
La fonction lectureFichierShader() :
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 char *lectureFichierShader(char *chemin) { unsigned int tailleFichier; char *contenuFichier; FILE *fichier=fopen(chemin,"rb"); if(fichier==NULL) { printf("Erreur chargement '%s', presser une touche pour quitter",chemin); getch(); return NULL; } fseek(fichier,0,SEEK_END); tailleFichier=ftell(fichier); rewind(fichier); contenuFichier=(char*)malloc((tailleFichier+1)*sizeof(char)); fread(contenuFichier,tailleFichier,1,fichier); contenuFichier[tailleFichier]='\0'; fclose(fichier); return contenuFichier; }
La fonction verifCompilShader() :
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 bool verifCompilShader(GLuint shader) { GLint statut; char *log; int tailleLog; glGetShaderiv(shader,GL_COMPILE_STATUS,&statut); if(statut!=GL_TRUE) //Erreur compilation { glGetShaderiv(shader,GL_INFO_LOG_LENGTH,&tailleLog); //Récup taille log de compilation tailleLog++; log=(char*)malloc(tailleLog*sizeof(char)); glGetShaderInfoLog(shader,tailleLog,&tailleLog,log); printf("Erreur compilation : '%s', presser une touche pour quitter",log); free(log); getch(); glDeleteShader(shader); return false; } return true; }
La fonction verifLiage() :
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 bool verifLiage(GLuint programID) { GLint statut; char *log; int tailleLog; glGetProgramiv(programID,GL_LINK_STATUS,&statut); if(statut!=GL_TRUE) { glGetProgramiv(programID,GL_INFO_LOG_LENGTH,&tailleLog); tailleLog++; log=(char*)malloc(tailleLog*sizeof(char)); glGetProgramInfoLog(programID,tailleLog,&tailleLog,log); printf("Erreur liage programe : '%s', presser une touche pour quitter",log); free(log); getch(); glDeleteProgram(programID); return false; } return true; }
Voici mon vertex shader :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 uniform int variable; uniform vec3 vecteur; void main(void) { gl_FrontColor=gl_Color; gl_Position=gl_ModelViewProjectionMatrix*gl_Vertex; }
Et mon fragment shader :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 void main(void) { gl_FragColor=gl_Color; }
Bref je ne peux pas découvrir la puissance des shaders à cause d'un problème assez mystérieux. Si une âme charitable peut m'aider à débloquer cela. Merci par avance.
Partager