Bonjour,
Je code en java avec LWJGL mais bon c'est de l'opengl donc peu importe le langage et l'api ce sont les mêmes fonctions.

J'ai donc un problème pour afficher une texture avec les shaders, en gros ça ne m'affiche rien, normalement je devrais voir un carré texturé mais non ça veut pas ... J'ai essayé en le faisant à l'ancienne (glBegin glTexCoord2f glVertex glEnd) ça fonctionne niquel mais je veux faire ça avec les shaders.


Voici comment je génère la texture:
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
        			Texture t = TextureLoader.getTexture("PNG", new FileInputStream(new File(file)));
 
        			int texId = GL11.glGenTextures();
 
        			GL13.glActiveTexture(GL13.GL_TEXTURE0);
        			GL11.glBindTexture(GL11.GL_TEXTURE_2D, texId);
 
        			// All RGB bytes are aligned to each other and each component is 1 byte
        			GL11.glPixelStorei(GL11.GL_UNPACK_ALIGNMENT, 1);
        			ByteBuffer b = BufferUtils.createByteBuffer(t.getTextureData().length);
        			b.put(t.getTextureData());
        			b.flip();
 
        			// Upload the texture data and generate mip maps (for scaling)
        			GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGB, t.getTextureWidth(), t.getTextureHeight(), 0,
        			GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, b);
        			GL30.glGenerateMipmap(GL11.GL_TEXTURE_2D);
 
        			// Setup the ST coordinate system
        			GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_REPEAT);
        			GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL11.GL_REPEAT);
 
        			// Setup what to do when the texture has to be scaled
        			GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER,
        			GL11.GL_NEAREST);
        			GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER,
        			GL11.GL_LINEAR_MIPMAP_LINEAR);
Je récupère le texId qui est l'identifiant de la texture, ensuite pour l'activer lors du rendu je fais :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
        			GL20.glUseProgram(program);
        			//
        			GL13.glActiveTexture(GL13.GL_TEXTURE0);
        			glUniform1i(glGetUniformLocation(program, "texture_diffuse"), 0);
        			GL11.glBindTexture(GL11.GL_TEXTURE_2D, texture);
                                     .
                                     .
                                     .
 
        			GL20.glUseProgram(program);


pour le vertex shader :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
        in vec4 in_Position;
        in vec4 in_Color;
        in vec2 in_TextureCoord;
 
        out vec4 pass_Color;
        out vec2 pass_TextureCoord;
 
        void main(void) {
        gl_Position = gl_ModelViewProjectionMatrix *in_Position;
        pass_Color = in_Color;
        pass_TextureCoord = in_TextureCoord;
        }



et le fragment :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
        uniform sampler2D texture_diffuse;
 
        in vec4 pass_Color;
        in vec2 pass_TextureCoord;
 
        void main(void) {
 
        gl_FragColor = texture(texture_diffuse, pass_TextureCoord); 
        //gl_FragColor = pass_Color;
        }

les valeurs dans in_Position, pass_Color et pass_TextureCoord sont bonnes car j'arrive à afficher mon cube avec les bonnes couleurs si je vire la ligne soulignée. Le problème vient de là je pense.

edit: Hum je viens de re-regarder et en fait j'arrive à afficher quelque chose mais j'ai l'impression que j'ai que le pixel en haut à gauche de mon image qui s'affiche sur tout mon carré (j'ai changé la couleur de ce pixel pour le voir et le carré prenait cette couleur ...) je comprends pas.



edit2: à tous ceux qui vont utiliser
Code : Sélectionner tout - Visualiser dans une fenêtre à part
Texture t = TextureLoader.getTexture("PNG", new FileInputStream(new File(file)));
ça sert à rien de faire deux fois la même chose, ce code est déjà effectué dans la fonction

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
 
 
        			int texId = GL11.glGenTextures();
 
        			GL13.glActiveTexture(GL13.GL_TEXTURE0);
        			GL11.glBindTexture(GL11.GL_TEXTURE_2D, texId);
 
        			// All RGB bytes are aligned to each other and each component is 1 byte
        			GL11.glPixelStorei(GL11.GL_UNPACK_ALIGNMENT, 1);
        			ByteBuffer b = BufferUtils.createByteBuffer(t.getTextureData().length);
        			b.put(t.getTextureData());
        			b.flip();
 
        			// Upload the texture data and generate mip maps (for scaling)
        			GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGB, t.getTextureWidth(), t.getTextureHeight(), 0,
        			GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, b);
        			GL30.glGenerateMipmap(GL11.GL_TEXTURE_2D);
 
        			// Setup the ST coordinate system
        			GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_REPEAT);
        			GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL11.GL_REPEAT);
 
        			// Setup what to do when the texture has to be scaled
        			GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER,
        			GL11.GL_NEAREST);
        			GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER,
        			GL11.GL_LINEAR_MIPMAP_LINEAR);
.


Moralité il faut toujours regarder le code des api sinon on fait de la merde