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 :

[GLSL] Erreur de compilation


Sujet :

OpenGL

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 396
    Par défaut [GLSL] Erreur de compilation
    Bonjour,

    J'ai un fragment shader en GLSL qui ne compile pas.
    L'erreur qui en ressort est assez inhabituelle et elle ne m'aide pas vraiment à trouver le problème:
    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    #version 330
    #extension GL_EXT_gpu_shader4 : enable
     
    in vec2 textCoordinates;
     
    //deferred textures:
    uniform sampler2D depthTex;
    uniform sampler2D colorTex;
    uniform sampler2D normalAndAmbientTex;
    uniform mat4 mInverseViewProjection;
     
    //lights and shadows:
    struct StructLightInfo
    {
    	bool isExist;
    	vec3 position;
    	bool produceShadow;
     
    	float constantAtt;
    	float linearAtt;
    	float quadraticAtt;
    	vec4 lightAmbient;
     
    	sampler2DArray depthShadowTex;
    	mat4 mLightProjectionView[3];
    	mat4 mShadowOffset[3];
    };
    uniform StructLightInfo lightsInfo[16];
    uniform float depthSplitDistance[3];
    uniform vec4 globalAmbient;
     
    out vec4 fragColor;
     
    void main()
    {
    	vec4 diffuse = texture2D(colorTex, textCoordinates);
    	vec4 normalAndAmbient = vec4(texture2D(normalAndAmbientTex, textCoordinates));
    	vec3 normal = vec3(normalAndAmbient) * 2.0 - 1.0;
    	float modelAmbientFactor = normalAndAmbient.a;
     
    	vec4 texPosition = vec4(
    		textCoordinates.s * 2.0 - 1.0,
    		textCoordinates.t * 2.0 - 1.0,
    		texture2D(depthTex, textCoordinates).r * 2.0 - 1.0,
    		1.0
    	);
    	vec4 position = mInverseViewProjection * texPosition;
    	position /= position.w;
     
    	if(modelAmbientFactor >= 0.999)
    	{ //no lighting
    		fragColor = diffuse;
    	}else
    	{
    		fragColor = globalAmbient * modelAmbientFactor;
    		for(int i=0; i<16;++i)
    		{
    			if(lightsInfo[i].isExist)
    			{
    				vec3 vertexToLight = lightsInfo[i].position - vec3(position);
    				vec3 vertexToLightNormalized = normalize(vertexToLight);
     
    				float NdotL = max(dot(normal, vertexToLightNormalized), 0.0);
     
    				fragColor += NdotL; //diffuse * NdotL;
    			}
    		}
    	}
    }
    Si je commente la dernière ligne (fragColor), je n'ai plus de problème. Il semble que le problème se produit quand j'utilise la variable NdotL.

    Voici l'erreur:
    Fragment info
    -------------
    Internal error: assembly compile error for fragment shader at offset 15355:
    -- error message --
    line 250, column 35: error: invalid local parameter number
    line 256, column 19: error: out of bounds array access
    line 258, column 18: error: out of bounds array access
    line 259, column 35: error: out of bounds array access
    line 263, column 18: error: out of bounds array access
    line 268, column 17: error: out of bounds array access
    //........
    -- internal assembly text --
    !!NVfp4.1
    OPTION NV_parameter_buffer_object2;
    # cgc version 3.1.0001, build date Apr 30 2012
    # command line args:
    #vendor NVIDIA Corporation
    #version 3.1.0.1
    #profile gp4_1fp
    #program main
    #semantic depthTex
    #semantic colorTex
    #semantic normalAndAmbientTex
    #semantic mInverseViewProjection
    #semantic lightsInfo
    //.......
    Si nécessaire, je peux vous donner le message d'erreur complet mais il est assez long.

    Merci d'avance.

  2. #2
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 614
    Par défaut
    Salut,

    Et en replaçant par fragColor = fragColor + vec4(NdotL) ?
    Les compilo GLSL sont parfois capricieux sur les conversions implicites ou les expressions un peu trop compacte.

    Mais d'après l'erreur (out of bounds array access), ça ressemble à un problème avec lightsInfo[i]. Essaye de replacer lightsInfo[i].isExist par true et lightsInfo[i].position par vec3(1) par ex. Je ne sais pas si les tableaux de structure de tableaux sont supportés en GLSL 3.3 mais même s'ils le sont, on est pas à l'abris d'un bug de compilo...

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 396
    Par défaut
    Quand je diminue mon nombre d'uniform, je n'ai plus d'erreur.

    Je viens de regarder la limite d'uniform (GL_MAX_FRAGMENT_UNIFORM_COMPONENTS) et j'obtiens 2048.
    Quand je fais le calcul pour mon shader, j'obtiens ceci: 1+1+1+16+((1+3+1+1+1+1+4+1+16*3+16*3)*16)+3*1+4 = 1770.
    Je suis donc en dessous de 2048.

    Par contre, je ne sais pas combien vaut un sampler2D et un sampler2DArray (j'ai compté 1). Une idée ?

  4. #4
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 032
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 032
    Billets dans le blog
    12
    Par défaut
    Je pense que passer 16 fois ta structure pose un gros soucis.
    Je me souviens que je ne pouvais pas passer plus de 4 lumières (position, couleur, attenuations, cutoff et exponent) sur certaines architectures, raison pour laquelle je suis passé aux textures pour passer mes lumières (je peux maintenant sans problème en passer 100)
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 074
    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 074
    Billets dans le blog
    145
    Par défaut
    Bonjour,

    En effet sur toutes les cartes graphiques, nous avons des limites sur le nombres d'uniforms et de données que l'on peut passer au shader.
    Comme il a été dit, la solution qui suit, c'est d'utiliser les textures.

    Avec glGet() nous pouvons connaitre le nombre de variables pouvant être passées
    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.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 396
    Par défaut
    Merci pour vos réponses.
    Je vais donc passer aux textures.

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

Discussions similaires

  1. Erreur de compilation après modification du Uses
    Par DevelOpeR13 dans le forum Langage
    Réponses: 5
    Dernier message: 30/10/2007, 14h23
  2. Réponses: 2
    Dernier message: 23/09/2003, 14h32
  3. Réponses: 10
    Dernier message: 22/09/2003, 21h58
  4. Réponses: 4
    Dernier message: 27/08/2003, 21h34
  5. Réponses: 2
    Dernier message: 04/03/2003, 23h24

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