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 :

{bug} Decalage du rasterizer sur une bande


Sujet :

OpenGL

  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 219
    Par défaut {bug} Decalage du rasterizer sur une bande
    Bonsoir à tous

    Je post aujourd'hui car je suis confronté à un bug de rendu graphique très désagréable. Je ne sais pas pourquoi, à une orientation précise de la camera j'ai comme un décalage de rendu comme vous pouvez le voir sur la capture d'écran. Or mon océan est rendu en un seul coup avec un shader (vertex et fragment) sans conditions ... Que du linéaire ! Aucun changement de uniform pendant le rendu. De plus ce décalage ne correspond pas à des triangles du plan.

    Avez vous déjà eu ce souci ? Savez vous se qu'il faut faire pour l'éviter ?

    Je vous remercie de votre lecture ainsi que de vos réponses.
    Images attachées Images attachées  

  2. #2
    Membre chevronné
    Inscrit en
    Février 2008
    Messages
    413
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Février 2008
    Messages : 413
    Par défaut
    Bonjour,

    il faudrait un peu plus de précisions...sous quelle plateforme travailles-tu? Comment affiches-tu ta scène? Un mesh, un quad?

    sinon éventuellement un problème de drivers?

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 219
    Par défaut
    oui, bien sur ...

    Je travail sous windows (Seven) ... l'océan est un mesh ayant 12 faces disposé en cercle autour d'un même vertex commun et tracé par un vertex array. La simulation des vagues est par normal mapping. Les cordonné de la texture de normals sont les positions des vertex additionné un décalage entre 0 et 1 pour faire déplacer les vagues. Il n'y a aucun post effect, c'est directement rendu à l'écran. J'utilise les frambuffer pour le reflet du ciel dans l'eau puis le met dans une texture pour le re utilisé dans le shader.

    Aussi, ce souci se reproduit sur l'ordinateur d'un amis, mais pas pour la même position de camera. donc un souci de driver me paraitrai peut probable ... (testé donc sur une GT 330 et GTX 480). Seulement, le fait qu'il n'y ai aucune condition dans mon shader mais que l'on vois bien que c'est une très nette séparation me laisse perplexe. Je pense que le problème viendrai des interpolations des varying.

  4. #4
    Membre éclairé Avatar de TNT89
    Inscrit en
    Juillet 2007
    Messages
    358
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : Juillet 2007
    Messages : 358
    Par défaut
    Peux-tu poster les codes de tes shaders, notamment celui du pixel shader, s'il te plaît?
    La position de la caméra est elle spéciale (angle - visualisation de la scène)?

  5. #5
    Membre chevronné
    Homme Profil pro
    Ingénieur 3D
    Inscrit en
    Avril 2008
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur 3D

    Informations forums :
    Inscription : Avril 2008
    Messages : 400
    Par défaut
    Est-ce que tu utilises des Render To Texture ? Parceque ca ressemble un peu a ce qui arrive quand on lit et modifie la meme texture depuis un shader.

  6. #6
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 219
    Par défaut
    Je dispense le shader de la skybox, car le bug ne se produit que sur l'eau quelque soit la config.

    Voici donc le code du shader de l'eau :
    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
     
     
    FarAwayShader.name (OCEAN::FAR_AWAY)
     
     
    FarAwayShader.vertex
    {
    	uniform mat4 ProjectionMatrix ;
    	uniform vec4 CameraPos ;
     
    	void main ()
    	{
    		gl_Position = ProjectionMatrix * gl_Vertex ;
    		gl_TexCoord[0] = CameraPos - gl_Vertex ;
    		gl_TexCoord[1].xy = gl_Vertex.xy * 0.025 ;
    	}
    }
     
    FarAwayShader.fragment
    {
    	uniform sampler2D ReflectionRender ;
    	uniform sampler2D NormalMap1 ;
    	uniform vec2 ResolutionCoefs ;
     
    	uniform vec3 SunPos ;
    	uniform vec3 SunSpecular ;
    	uniform vec2 TextureDelta ;
    	uniform vec3 WaterColor ;
     
    	void main ()
    	{
    		const float WaveMaxDistance = 120.0f ;
     
    		vec3 Direction = normalize (gl_TexCoord[0].xyz);
     
    		vec3 Normal1 = texture2D (NormalMap1, gl_TexCoord[1].xy + TextureDelta.xy).rgb * 2.0 - 1.0 ;
    		vec3 Normal2 = texture2D (NormalMap1, gl_TexCoord[1].xy + 0.5 * TextureDelta.xy).rgb * 2.0 - 1.0 ;
    		vec3 Normal = normalize (Normal1 + Normal2) ;
    		vec3 ReflectColor = texture2D (ReflectionRender, gl_FragCoord.xy * ResolutionCoefs).rgb;
     
    		float FromCamera = length (gl_TexCoord[0].xyz) ;
    		float ReflectCoef = max (dot (Normal, Direction), 0.0) * max (1.0 - FromCamera /WaveMaxDistance, 0.0) ;
     
    		float SpecularCoef = min (exp ((WaveMaxDistance - FromCamera) * 0.02), 1.0);
     
    		vec3 Specular = SunSpecular * clamp (dot (reflect (-SunPos, Normal), Direction) * 24.0 - 23.0, 0.0, 1.0);
     
    		gl_FragColor.rgb = mix (ReflectColor, WaterColor, ReflectCoef) + Specular * SpecularCoef ;
     
    		gl_FragColor.a = 1.0f ;
    	}
    }
    Inutile de vous expliquer comment fonctionne mon format de fichier pour les shaders, je pense que vous comprendriez !

    pour les fram buffer, voici ma class :

    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
     
    class FRAM_BUFFER
    {
    public:
    	// ------------------------------------ VARS
        GLuint FramId, TextureId, DepthTextureId ;
    	GLuint DepthBuffer ;
     
    	bool ActivedDepthTexture ;
    	size2i FramDimension ;
     
    	// ------------------------------------ FUNCTION
     
    	void creat (const size2i & Size, const bool DethBuffer = true);
    	void resize (const size2i & NewSize);
    	void release ();
     
    	// ------------------------------------ INLINE FUNCTION
        inline void select ()
    	{
    		glBindFramebuffer (GL_FRAMEBUFFER_EXT, FramId);
        }
     
        inline void unSelect ()
    	{
            glBindFramebuffer (GL_FRAMEBUFFER_EXT, 0);
        }
     
     
    	inline void bindRenderTexture (const GLenum TextId)
    	{
    		glActiveTexture (TextId);
    		glBindTexture (GL_TEXTURE_2D, TextureId);
    	}
     
    	inline void bindDepthTexture (const GLenum TextId)
    	{
    		glActiveTexture (TextId);
    		glBindTexture (GL_TEXTURE_2D, ActivedDepthTexture);
    	}
     
     
    	// ------------------------------------ IDLE
    	FRAM_BUFFER ();
    	~FRAM_BUFFER ();
     
     
    };
    et mon rendu se fait de cette manière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    ReflectFram.select ();
     
    // dessin de la skybox renversé.
     
    ReflectFram.unselect ();
     
    // dessin de la skybox.
    // dessin de l'ocean
    {
    ReflectFram.bindRenderTexture (GL_TEXTURE0);
    // autre appel pour le rendu (sélection du shader, de la normal map et compagnie)
    }
    EDIT:
    La position de la caméra est elle spéciale (angle - visualisation de la scène)?
    Et bien, ce bug arrive à une orientation autour de l'axe des Z, on peut modifié l'orientation vertical de la camera, le bug reste.

  7. #7
    Membre très actif Avatar de oxyde356
    Homme Profil pro
    Ingénieur Recherche Imagerie
    Inscrit en
    Février 2006
    Messages
    797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Recherche Imagerie

    Informations forums :
    Inscription : Février 2006
    Messages : 797
    Par défaut
    Pour détecter plus facilement la provenance de ton bug, épure ton code au maximum de façon, essaye de voir si sans l'effet de vague tu as toujours le problème, pareil en enlevant la texture, en affichant un mesh plus simple etc...

  8. #8
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 219
    Par défaut
    j'es beau essayé, rien y fais, le decalage se produit toujours même avec ce shader :

    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
     
    FarAwayShader.name (OCEAN::FAR_AWAY)
     
     
    FarAwayShader.vertex
    {
    	uniform mat4 ProjectionMatrix ;
    	uniform vec4 CameraPos ;
     
    	void main ()
    	{
    		gl_Position = ProjectionMatrix * gl_Vertex ;
    		gl_TexCoord[0] = CameraPos - gl_Vertex ;
    	}
    }
     
    FarAwayShader.fragment
    {
    	void main ()
    	{
    		gl_FragColor.rgb = normalize (gl_TexCoord[0].xyz);
     
    		gl_FragColor.a = 1.0f ;
    	}
    }

  9. #9
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 219
    Par défaut
    Ok, j'ai trouvé le souci, c'est les vertex était l'ordre du million, ce qui est énorme pour un float. le faite de réduire ma surface de l'océan à définitivement réglé le problème !

    J'en était même arrivé à re-écrire mon shader en glsl 1.5.

    Encore merci de vos aides !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 27/09/2014, 15h00
  2. Date et heure en temps réel sur une bande noire !
    Par cincap dans le forum Général JavaScript
    Réponses: 23
    Dernier message: 15/02/2014, 22h41
  3. Réponses: 1
    Dernier message: 11/06/2013, 15h25
  4. Réponses: 0
    Dernier message: 03/04/2012, 20h03
  5. Ajout de bruit blanc sur une bande definie
    Par Uno48 dans le forum Mathématiques
    Réponses: 3
    Dernier message: 28/03/2009, 14h27

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