Bonjour,
Je suis actuellement en train de développer un moteur de particules dont chaque particule est un gl_point texturé.
Le soucis est que au chargement de la texture qui correspond une une particule (une texture avec un canal alpha) et bien toutes les textures de ma scène se retrouvent mélangées/buggent, et cela meme si je n'affiche pas les particules, il me suffit de charger la texture.
Voici le code du chargement:
Je ne voit vraiment pas ce qui est mal fait donc si vous avec des remarques/commentaires, n'hésitez pas.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 sf::Image texture; if( texture.loadFromFile("textures/particle.png") == false ) { std::cerr << "Particle : Erreur lors du chargement de la texture particle.png." << std::endl; std::exit(1); } glGenTextures(1, &m_id_tex); glBindTexture(GL_TEXTURE_2D, m_id_tex); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, texture.getSize().x, texture.getSize().y, GL_RGBA, GL_UNSIGNED_BYTE, texture.getPixelsPtr()); glBindTexture(GL_TEXTURE_2D, 0);
Merci d'avance.
Edit:
Etant donné que le soucis peut se trouver avant dans le code, je vous met le partie qui s'occupent du chargement des textures:
4 textures chargées ici:
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 glGenTextures(4, m_id_tex); /* Chargement des textures */ for(uint i=0; i<4; i++) { if( textures[i].loadFromFile(srcTextures[i]) == false ) { std::cout << "Terrain : Erreur lors du chargement de la texture " << srcTextures[i] << "." << std::endl; std::exit(1); } glBindTexture(GL_TEXTURE_2D, m_id_tex[i]); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, textures[i].getSize().x, textures[i].getSize().y, GL_RGBA, GL_UNSIGNED_BYTE, textures[i].getPixelsPtr()); } glBindTexture(GL_TEXTURE_2D, 0);
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 glUseProgram(m_shaderProgram); glUniform1i(m_uniform_heightmap, 0); glUniform1i(m_uniform_sand, 1); glUniform1i(m_uniform_grass, 2); glUniform1i(m_uniform_rock, 3); glUseProgram(0);chargement de la cupermap:
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 glUseProgram(m_shaderProgram); glGenVertexArrays(1, &m_id_vao); glBindVertexArray(m_id_vao); /* Envoi de la heightmap et des textures au fragment shader */ for(int i=0; i<4; i++) { glActiveTexture(GL_TEXTURE0 + i); glBindTexture(GL_TEXTURE_2D, m_id_tex[i]); } /* On appelle toutes les fonctions qui modifient l'état des tableaux de sommets */ glEnableVertexAttribArray(m_vertexPositionAttrib); glEnableVertexAttribArray(m_vertexNormalAttrib); glEnableVertexAttribArray(m_vertexTexCoordAttrib); /* Activation du buffer des vertices */ glBindBuffer(GL_ARRAY_BUFFER, m_vbo->m_id_vbo); /* Envoi des données */ glVertexAttribPointer(m_vertexPositionAttrib, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), POSITION_OFFSET); glVertexAttribPointer(m_vertexNormalAttrib , 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), NORMAL_OFFSET); glVertexAttribPointer(m_vertexTexCoordAttrib, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), TEXCOORD_OFFSET); /* Activation du buffer des indices */ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_vbo->m_id_ibo); glBindVertexArray(0); glUseProgram(0);
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 /* Génération d'une texture de type CubeMap */ glGenTextures(1, &m_id_cubeMap); glBindTexture(GL_TEXTURE_CUBE_MAP, m_id_cubeMap); /* Conversion des images en textures */ for(uint i=0; i<6; i++) { glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexImage2D(cube_map_target[i], 0, GL_RGBA, texture[i].getSize().x, texture[i].getSize().y, 0, GL_RGBA, GL_UNSIGNED_BYTE, texture[i].getPixelsPtr()); } glBindTexture(GL_TEXTURE_CUBE_MAP, 0);
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 glUseProgram(m_shaderProgram); glUniform1i(m_uniform_cubeMap, 0); glUseProgram(0);
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 glUseProgram(m_shaderProgram); glGenVertexArrays(1, &m_id_vao); glBindVertexArray(m_id_vao); /* Envoi du cubeMap au fragment shader */ glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_CUBE_MAP, m_id_cubeMap); /* On appelle toutes les fonctions qui modifient l'état des tableaux de sommets */ glEnableVertexAttribArray(m_vertexPositionAttrib); /* Activation du buffer des vertices */ glBindBuffer(GL_ARRAY_BUFFER, m_vbo.m_id_vbo); /* Envoi des données */ glVertexAttribPointer(m_vertexPositionAttrib, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), POSITION_OFFSET); /* Activation du buffer des indices */ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_vbo.m_id_ibo); glBindVertexArray(0); glUseProgram(0);
Partager