Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: Définir un ordre d'affichage par vertex.  (Lu 16514 fois)

0 Membres et 1 Invité sur ce sujet

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Re : Définir un ordre d'affichage par vertex.
« Réponse #30 le: Juillet 05, 2013, 12:21:35 pm »
C'est GL_DEPTH_BUFFER_BIT. ^^
Ok je vais tester ça.

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Re : Définir un ordre d'affichage par vertex.
« Réponse #31 le: Juillet 05, 2013, 12:30:40 pm »
Ca ne marche toujours pas, même problème ça s'affiche une fois puis ça disparait.  :o

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Re : Définir un ordre d'affichage par vertex.
« Réponse #32 le: Juillet 05, 2013, 12:42:13 pm »
Faut pas faire glClearDepth(1) plutôt ?

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Re : Définir un ordre d'affichage par vertex.
« Réponse #33 le: Juillet 05, 2013, 01:04:48 pm »
Bon peu importe dans tout les cas ça ne résoud pas le problème.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Définir un ordre d'affichage par vertex.
« Réponse #34 le: Juillet 05, 2013, 01:14:30 pm »
Citer
Faut pas faire glClearDepth(1) plutôt ?
Si ;)

Tu as bien pensé à appeler glDepthMask(GL_TRUE) aussi ?
Laurent Gomila - SFML developer

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Re : Définir un ordre d'affichage par vertex.
« Réponse #35 le: Juillet 05, 2013, 01:27:41 pm »
J'ai rajouté le glDepthMask a true, mais toujours le même problème, tout ce que j'affiche après avoir activé le depthtest s'affiche puis disparait.

Voici mes fonction :
////////////////////////////////////////////////////////////
void RenderTarget::resetGLStates()
{
    if (activate(true))
    {
        // Make sure that GLEW is initialized
        priv::ensureGlewInit();

        // Define the default OpenGL states
        glCheck(glDisable(GL_CULL_FACE));
        glCheck(glDisable(GL_LIGHTING));
        glCheck(glDisable(GL_DEPTH_TEST));
        glCheck(glDisable(GL_ALPHA_TEST));
        glCheck(glEnable(GL_TEXTURE_2D));
        glCheck(glEnable(GL_BLEND));
        glCheck(glMatrixMode(GL_MODELVIEW));
        glCheck(glEnableClientState(GL_VERTEX_ARRAY));
        glCheck(glEnableClientState(GL_COLOR_ARRAY));
        glCheck(glEnableClientState(GL_TEXTURE_COORD_ARRAY));
        glCheck(glEnable(GL_ALPHA_TEST));
        glCheck(glAlphaFunc(GL_GREATER, 0));
        glCheck(glClearDepth(1));
        glCheck(glDepthMask(GL_TRUE));

        m_cache.glStatesSet = true;

        // Apply the default SFML states
        applyBlendMode(BlendAlpha);
        applyTransform(Transform::Identity);
        applyTexture(NULL);
        if (Shader::isAvailable())
            applyShader(NULL);
        m_cache.useVertexCache = false;

        // Set the default view
        setView(getView());
    }
}
 

////////////////////////////////////////////////////////////
void RenderTarget::draw(const Vertex* vertices, unsigned int vertexCount,
                        PrimitiveType type, const RenderStates& states)
{
    // Nothing to draw?
    if (!vertices || (vertexCount == 0))
        return;

    if (activate(true))
    {
        // First set the persistent OpenGL states if it's the very first call
        if (!m_cache.glStatesSet)
            resetGLStates();

        // Check if the vertex count is low enough so that we can pre-transform them
        bool useVertexCache = (vertexCount <= StatesCache::VertexCacheSize);
        if (useVertexCache)
        {
            // Pre-transform the vertices and store them into the vertex cache
            for (unsigned int i = 0; i < vertexCount; ++i)
            {
                Vertex& vertex = m_cache.vertexCache[i];
                Vector2f v2Pos = states.transform * Vector2f(vertices[i].position.x, vertices[i].position.y);
                (vertices[i].position.z < 0) ? glCheck(glDisable(GL_DEPTH_TEST)) : glCheck(glEnable(GL_DEPTH_TEST));
                (vertices[i].position.z > 1) ? vertex.position = Vector3f(v2Pos.x, v2Pos.y, 1) :  vertex.position = Vector3f(v2Pos.x, v2Pos.y, vertices[i].position.z);
                vertex.color = vertices[i].color;
                vertex.texCoords = vertices[i].texCoords;
            }

            // Since vertices are transformed, we must use an identity transform to render them
            if (!m_cache.useVertexCache)
                applyTransform(Transform::Identity);
        }
        else
        {
            applyTransform(states.transform);
        }

        // Apply the view
        if (m_cache.viewChanged)
            applyCurrentView();

        // Apply the blend mode
        if (states.blendMode != m_cache.lastBlendMode)
            applyBlendMode(states.blendMode);

        // Apply the texture
        Uint64 textureId = states.texture ? states.texture->m_cacheId : 0;
        if (textureId != m_cache.lastTextureId)
            applyTexture(states.texture);

        // Apply the shader
        if (states.shader)
            applyShader(states.shader);

        // If we pre-transform the vertices, we must use our internal vertex cache
        if (useVertexCache)
        {
            // ... and if we already used it previously, we don't need to set the pointers again
            if (!m_cache.useVertexCache)
                vertices = m_cache.vertexCache;
            else
                vertices = NULL;
        }

        // Setup the pointers to the vertices' components
        if (vertices)
        {
            const char* data = reinterpret_cast<const char*>(vertices);
            glCheck(glVertexPointer(3, GL_FLOAT, sizeof(Vertex), data + 0));
            glCheck(glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(Vertex), data + 12));
            glCheck(glTexCoordPointer(2, GL_FLOAT, sizeof(Vertex), data + 16));
        }

        // Find the OpenGL primitive type
        static const GLenum modes[] = {GL_POINTS, GL_LINES, GL_LINE_STRIP, GL_TRIANGLES,
                                       GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN, GL_QUADS};
        GLenum mode = modes[type];

        // Draw the primitives
        glCheck(glDrawArrays(mode, 0, vertexCount));

        // Unbind the shader, if any
        if (states.shader)
            applyShader(NULL);

        // Update the cache
        m_cache.useVertexCache = useVertexCache;
    }
}
 

////////////////////////////////////////////////////////////
void RenderTarget::clear(const Color& color)
{
    if (activate(true))
    {
        glCheck(glClearColor(color.r / 255.f, color.g / 255.f, color.b / 255.f, color.a / 255.f));
        glCheck(glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT));
    }
}
 

Ai je encore oublié quelque chose ? X_X
« Modifié: Juillet 05, 2013, 01:29:18 pm par Lolilolight »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Définir un ordre d'affichage par vertex.
« Réponse #36 le: Juillet 05, 2013, 01:31:46 pm »
Tu pars avec GL_ALPHA_TEST désactivé, et tu ne l'actives pas au bon endroit. Déjà, ce morceau de code est exécuté uniquement lorsque le nombre de vertex est très petit (de mémoire ça doit être 4). Ensuite, admettons que tu sois dans ce cas de figure, tu fais potentiellement plein de glEnable/glDisable à la suite sans rien dessiner entre chaque appel, ça n'aura aucun effet. En plus l'état final ne va dépendre que de la coordonnée Z du dernier vertex, ton algorithme est mauvais.
Laurent Gomila - SFML developer

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Re : Définir un ordre d'affichage par vertex.
« Réponse #37 le: Juillet 05, 2013, 01:44:44 pm »
Citer
Tu pars avec GL_ALPHA_TEST désactivé, et tu ne l'actives pas au bon endroit. Déjà, ce morceau de code est exécuté uniquement lorsque le nombre de vertex est très petit (de mémoire ça doit être 4).

Je dois l'activer quand le GL_ALPHA_TEST ?
Et hum, ça ne dessine pas tout les vertex d'un vertexarray cette méthode draw ?
Pourquoi tu me dis que ça ne va marche que lorsque le nombre de vertex est très petits ?

Citer
Ensuite, admettons que tu sois dans ce cas de figure, tu fais potentiellement plein de glEnable/glDisable à la suite sans rien dessiner entre chaque appel, ça n'aura aucun effet.
Ha ok il faut obligatoirement dessiner entre chaque appel à Enable et disable. ^^
En fait je veux activer et désactiver le depthtest au dessin de chaque vertexarray vu que je vois que toutes tes classes utilisent des vertexarray mais c'est ou que tu dessines ses vertexarray ???


Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Définir un ordre d'affichage par vertex.
« Réponse #38 le: Juillet 05, 2013, 01:54:21 pm »
Citer
Je dois l'activer quand le GL_ALPHA_TEST ?
Avant de dessiner le truc pour lequel tu veux que ce soit actif. Les états OpenGL ne font rien quand tu les changes, c'est uniquement lors du prochain dessin qu'ils sont pris en compte.

Citer
Et hum, ça ne dessine pas tout les vertex d'un vertexarray cette méthode draw ?
Ca dessine ce qu'on lui passe en paramètre, donc si tu as appelé window.draw(vertexArray), oui ça va tout dessiner.

Citer
Pourquoi tu me dis que ça ne va marche que lorsque le nombre de vertex est très petits ?
Tu vois bien que ce morceau de code est conditionné par un "if (vertexCount < xxx)". Et puis lis bien les commentaires, je pense qu'ils sont assez explicites quant à ce que fait chaque morceau de code ;)

Citer
En fait je veux activer et désactiver le depthtest au dessin de chaque vertexarray vu que je vois que toutes tes classes utilisent des vertexarray mais c'est ou que tu dessines ses vertexarray
C'est bien à cet endroit.

Ton problème c'est que tu veux activer ou désactiver le depth test par vertex, alors que tu ne peux le faire que par entité (tu peux le changer entre deux draw).
Laurent Gomila - SFML developer

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Re : Définir un ordre d'affichage par vertex.
« Réponse #39 le: Juillet 05, 2013, 03:49:58 pm »
Ha, ok, donc il y a deux fonction draw, une pour dessiner en utilisant les classe sfml de plus haut niveau et une pour dessiner en utilisant les entités d'opengl de plus bas niveau.
Mais je suppose que le draw qui dessine les entités de plus haut niveau utilise la fonction draw qui dessine les entités de plus bas niveau.

Ok bah ça va je pense que j'ai compris ou je dois faire les glDisable et les glEnable alors.  :)

Juste avant d'appeler la fonction draw qui dessine les entités de plus haut niveau dans RenderTarget c'est ça ?

Bref je vais tester ça une fois que mon PC sera réparé mais je dois rajouter une méthode virtuelle dans la classe drawable pour savoir si je dois activer le depthtest et l'alphatest.
Et si j'active le depthtest je pourrai redéfinir la fonction draw en envoyant au 2ème draw des vertex avec un z différent (ce que j'ai déjà fais d'ailleurs.) et ça va peut être enfin marcher. (Youhou!)

Au départ je pensais faire les glDisable et Enable dans la fonction draw de plus bas niveau mais en effet ce n'est pas le bonne endroit. (Vu que tu dessines surement toute l'entité d'un coup et pas vertex par vertex.)
« Modifié: Juillet 05, 2013, 03:58:01 pm par Lolilolight »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Définir un ordre d'affichage par vertex.
« Réponse #40 le: Juillet 05, 2013, 04:13:06 pm »
Citer
Mais je suppose que le draw qui dessine les entités de plus haut niveau utilise la fonction draw qui dessine les entités de plus bas niveau.
Oui, tout finit par arriver dans le draw(const Vertex*, etc.).

Citer
Juste avant d'appeler la fonction draw qui dessine les entités de plus haut niveau dans RenderTarget c'est ça ?
Non, tu peux le faire dans le draw bas niveau, mais simplement il faut le faire une seule fois, et non pas une fois pour chaque vertex comme tu le faisais, et qui plus est pas dans un morceau de code qui n'est exécuté que sous certaines conditions.
Laurent Gomila - SFML developer

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Re : Définir un ordre d'affichage par vertex.
« Réponse #41 le: Juillet 05, 2013, 04:18:34 pm »
Ok ça va j'ai compris merci.  :)
C'est l'un des rares codes source ou je ne me perd pas de trop :D

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Re : Définir un ordre d'affichage par vertex.
« Réponse #42 le: Juillet 06, 2013, 11:34:22 am »
Il faut dire que j'avais mal lu le code, je pensais que tu mettais tout dans le cache et que tu appliquais les pré-transformation puis que tu dessinais tout.

Mais en relisant mieux le code ça ne rentre dans le if que si il n'y a que 4 vertex dans le tableau.

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Re : Définir un ordre d'affichage par vertex.
« Réponse #43 le: Juillet 19, 2013, 10:25:48 pm »
Bon bah j'ai récupéré mon PC et ça marche sauf que j'ai un bord noir qui s'affiche sur le bord de mes tiles.

Franchement ça m'inquiète parce que toutes mes tiles du sol son sur la même couche donc même si y'a de la semi-transparence sur les bords, elles devraient s'emboîter correctement les unes dans les autres comme avant.
J'ai utiliser les masque de calques avec GIMP pour les bords des tiles.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Définir un ordre d'affichage par vertex.
« Réponse #44 le: Juillet 19, 2013, 10:38:48 pm »
Et bien c'est très exactement le problème de la semi-transparence non ? Les tiles sont devant à cause de leur valeur Z, mais elles sont dessinées en premier donc elles se mélangent avec la couleur de fond plutôt qu'avec les tiles du dessous (qui ne sont pas encore dessinées).
Laurent Gomila - SFML developer