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 :

Texturing GL_POINTS fait bugger toutes mes autres textures.


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2004
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 66
    Par défaut Texturing GL_POINTS fait bugger toutes mes autres textures.
    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:
    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);
    Je ne voit vraiment pas ce qui est mal fait donc si vous avec des remarques/commentaires, n'hésitez pas.

    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);
    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);
    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
     
        /* 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);

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 136
    Billets dans le blog
    150
    Par défaut
    Bonjour,

    Je me demande si pour deux textures différentes, vous n'envoyez pas deux fois le même id.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    glUniform1i(m_uniform_cubeMap, 0);
    Et :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    glUniform1i(m_uniform_heightmap, 0);
    Après, je me demande quel est le type de bogue, avec vous une capture à nous montrer ?

    Vous pouvez peut être essayer de tracer le programme avec gDEBugger.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2004
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 66
    Par défaut
    Effectivement, j'ai changé les id et cela fonctionne ! (enfin presque)

    Mais du coup j'ai quelques questions:
    - j'utilise 3 shaders différents pour les textures, un pour le terrain, un pour la skybox et un pour les particules, et je croyais que pour chaque shaders les id reprenaient à 0. Si ce n'est pas le cas, cela signifie que dans toute l'application je suis limité à GL_MAX_TEXTURE_UNITS textures ? Je croyais que c'était le nombre max par shaders, Il y a un truc que je n'ai pas du comprendre.

    - maintenant les textures s'affichent normalement sauf les particules, qui ont une unique couleur (qui semble dépendre du premier pixel de la texture plaqué dessus). Comment faire pour que la texture entière soit affichée à l'emplacement d'un gl_point ?
    voici les codes de chargement de texture et les shaders associés :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        m_id_tex = 0;
        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);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        glUseProgram(m_shaderProgram);
            glUniform1i(m_uniform_particleTex, 5);
        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
     
        glUseProgram(m_shaderProgram);
        glGenVertexArrays(1, &m_id_vao);
        glBindVertexArray(m_id_vao);
     
            glActiveTexture(GL_TEXTURE0+5);
                glBindTexture(GL_TEXTURE_2D, m_id_tex);
     
            /* 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);
    et le shaders associés:
    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
     
    #version 140
     
    /* Attributs */
    in vec3 VertexPosition;
     
    /* Uniform */
    uniform mat4 projection;
    uniform mat4 modelview;
    uniform vec3 cameraPos;
     
    void main()
    {   
    	gl_Position = projection * modelview * vec4(VertexPosition, 1.0);
     
    	float distance = length(VertexPosition.xyz - cameraPos.xyz);
    	gl_PointSize = 1000 / sqrt(1 + 0.6*distance + 0.01*distance*distance);
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #version 140
     
    uniform sampler2D particleTex; 
     
    // Sortie du fragment shader, ira dans le framebuffer principal
    out vec4 Color;
     
    void main()
    {
        Color = texture(particleTex, gl_PointCoord);
    }

Discussions similaires

  1. Réponses: 11
    Dernier message: 28/07/2014, 09h07
  2. Réponses: 2
    Dernier message: 26/09/2009, 20h23
  3. Réponses: 12
    Dernier message: 22/02/2006, 15h28
  4. Texture chargee qui apparait toute blanche
    Par barthelv dans le forum OpenGL
    Réponses: 2
    Dernier message: 18/01/2005, 11h57
  5. Réponses: 2
    Dernier message: 09/07/2003, 14h10

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