[OpenGL] geometry shader et glsl

Le côté programmation du développement d'un jeu vidéo.

geometry shader et glsl

Messagepar deathangel » 19 Juin 2009, 15:28

salut la foule

j'ai fait un geometry shader qui en passant 4 points openGl sous la forme de GL_ADJACENCY_LINE_EXT et me crée 4 triangles pour former un tetraedre. Ces Tetraedres peuvent être affecté par un plan de clipping, si le barycentre du tetraedre est au dessus/en dessous de mon plan de clipping alors il est visible/invisible.

Avec ca j'ai un pixel shader qui me calcule un éclairage phong.

Tout marchait très bien sans problème, jusqu'à ce matin ou j'ai mis à jour mes drivers nvidia (passage de 180.60 à 185.18.14) sous linux

et là depuis, mon geometry shader ne compile plus avec l'erreur C1068 : index out of bounds sur toutes mes lignes avec gl_PositionIn[3] (le 4ème point passé au shader)

est-ce que quelqu'un a déjà eu un problème similaire suite à une mise à jour de drivers ? ou a-t-il déjà eu ce problème tout court ?

ci-joint le code de mon shader :
Code: Tout sélectionner
#version 120
#extension GL_EXT_geometry_shader4 : enable

varying out vec3 myNormal;
varying out vec3 lightDir;
varying out vec3 eyeVec;

uniform float clipXn;
uniform float clipYn;
uniform float clipZn;
uniform float clipX;
uniform float clipY;
uniform float clipZ;
uniform bool clipV;
uniform float scale;

void main()
{
  //cas des tetraedres
  if (gl_VerticesIn==4)
  {
    //récupérer le barycentre
    vec4 bary=vec4(gl_ModelViewProjectionMatrixInverse * gl_PositionIn[0]);
    bary=bary+vec4(gl_ModelViewProjectionMatrixInverse * gl_PositionIn[1]);
    bary=bary+vec4(gl_ModelViewProjectionMatrixInverse * gl_PositionIn[2]);
    bary=bary+vec4(gl_ModelViewProjectionMatrixInverse * gl_PositionIn[3]);

    bary=bary/4.0f;

    vec4 barysave=bary;

    bary=bary*scale;

    //récupérer les infos du plan de clipping (position et normale)
    vec4 ptClip=vec4(clipX,clipY,clipZ,1);
    vec3 vecClip=vec3(clipXn, clipYn, clipZn);

    //vecteur plan barycentre
    vec3 vecDist=vec3(bary-ptClip);

    //calcul du produit scalaire
    float scal=dot(vecDist,vecClip);



    //si il est du bon cote du plan de clipping ou plan non défini
    if (scal>=0 || !clipV)
    {

      vec4 position0=gl_ModelViewProjectionMatrixInverse*gl_PositionIn[0];
      vec4 position1=gl_ModelViewProjectionMatrixInverse*gl_PositionIn[1];
      vec4 position2=gl_ModelViewProjectionMatrixInverse*gl_PositionIn[2];
      vec4 position3=gl_ModelViewProjectionMatrixInverse*gl_PositionIn[3];

      position0 = barysave + (0.8 * (position0-barysave));
      position1 = barysave + (0.8 * (position1-barysave));
      position2 = barysave + (0.8 * (position2-barysave));
      position3 = barysave + (0.8 * (position3-barysave));

      position0 = gl_ModelViewProjectionMatrix * position0;
      position1 = gl_ModelViewProjectionMatrix * position1;
      position2 = gl_ModelViewProjectionMatrix * position2;
      position3 = gl_ModelViewProjectionMatrix * position3;




      //vecteur lumière
      vec3 lv = vec3(gl_LightSource[0].position.xyz - vec3(gl_PositionIn[0]));
      lv = normalize(lv);

      //calculer la normale de la face
      vec3 A=vec3(gl_PositionIn[0]);
      vec3 B=vec3(gl_PositionIn[1]);
      vec3 C=vec3(gl_PositionIn[2]);

      vec3 AB=B-A;
      vec3 AC=C-A;
      vec3 N = cross(AB,AC);
      N=normalize(N);

   myNormal=N;

      //émettre les sommets du tetraedre (1er triangle)
      gl_FrontColor = gl_FrontColorIn[0];
      gl_Position = position0;
      lightDir = vec3(gl_LightSource[0].position.xyz - vec3(gl_PositionIn[0]));
      eyeVec=-vec3(gl_PositionIn[0]);
      EmitVertex();
      gl_FrontColor = gl_FrontColorIn[1];
      gl_Position = position1;
      lightDir = vec3(gl_LightSource[0].position.xyz - vec3(gl_PositionIn[1]));
      eyeVec=-vec3(gl_PositionIn[1]);
      EmitVertex();
      gl_FrontColor = gl_FrontColorIn[2];
      gl_Position = position2;
      lightDir = vec3(gl_LightSource[0].position.xyz - vec3(gl_PositionIn[2]));
      eyeVec=-vec3(gl_PositionIn[2]);
      EmitVertex();
      EndPrimitive();


      //-----------------------------------------------------
      //et on répète avec les 3 autres triangles du tetraedre
      A=vec3(gl_PositionIn[1]);
      B=vec3(gl_PositionIn[0]);
      C=vec3(gl_PositionIn[3]);

      AB=B-A;
      AC=C-A;
      N = cross(AB,AC);
      N=normalize(N);

   myNormal=N;

      gl_FrontColor = gl_FrontColorIn[1];
      gl_Position = position1;
      lightDir = vec3(gl_LightSource[0].position.xyz - vec3(gl_PositionIn[1]));
      eyeVec=-vec3(gl_PositionIn[1]);
      EmitVertex();
      gl_FrontColor = gl_FrontColorIn[0];
      gl_Position = position0;
      lightDir = vec3(gl_LightSource[0].position.xyz - vec3(gl_PositionIn[0]));
      eyeVec=-vec3(gl_PositionIn[0]);
      EmitVertex();
      gl_FrontColor = gl_FrontColorIn[3];
      gl_Position = position3;
      lightDir = vec3(gl_LightSource[0].position.xyz - vec3(gl_PositionIn[3]));
      eyeVec=-vec3(gl_PositionIn[3]);
      EmitVertex();
      EndPrimitive();


      //----------------------------------------------------
      A=vec3(gl_PositionIn[2]);
      B=vec3(gl_PositionIn[1]);
      C=vec3(gl_PositionIn[3]);

      AB=B-A;
      AC=C-A;
      N = cross(AB,AC);
      N=normalize(N);

   myNormal=N;

      gl_FrontColor = gl_FrontColorIn[2];
      gl_Position = position2;
      lightDir = vec3(gl_LightSource[0].position.xyz - vec3(gl_PositionIn[2]));
      eyeVec=-vec3(gl_PositionIn[2]);
      EmitVertex();
      gl_FrontColor = gl_FrontColorIn[1];
      gl_Position = position1;
      lightDir = vec3(gl_LightSource[0].position.xyz - vec3(gl_PositionIn[1]));
      eyeVec=-vec3(gl_PositionIn[1]);
      EmitVertex();
      gl_FrontColor = gl_FrontColorIn[3];
      gl_Position = position3;
      lightDir = vec3(gl_LightSource[0].position.xyz - vec3(gl_PositionIn[3]));
      eyeVec=-vec3(gl_PositionIn[3]);
      EmitVertex();
      EndPrimitive();


      //----------------------------------------------------
      A=vec3(gl_PositionIn[0]);
      B=vec3(gl_PositionIn[2]);
      C=vec3(gl_PositionIn[3]);

      AB=B-A;
      AC=C-A;
      N = cross(AB,AC);
      N=normalize(N);

   myNormal=N;

      gl_FrontColor = gl_FrontColorIn[0];
      gl_Position = position0;
      lightDir = vec3(gl_LightSource[0].position.xyz - vec3(gl_PositionIn[0]));
      eyeVec=-vec3(gl_PositionIn[0]);
      EmitVertex();
      gl_FrontColor = gl_FrontColorIn[2];
      gl_Position = position2;
      lightDir = vec3(gl_LightSource[0].position.xyz - vec3(gl_PositionIn[2]));
      eyeVec=-vec3(gl_PositionIn[2]);
      EmitVertex();
      gl_FrontColor = gl_FrontColorIn[3];
      gl_Position = position3;
      lightDir = vec3(gl_LightSource[0].position.xyz - vec3(gl_PositionIn[3]));
      eyeVec=-vec3(gl_PositionIn[3]);
      EmitVertex();
      EndPrimitive();
    }   
  }
}



et mon code openGL qui initialise ca :

Code: Tout sélectionner
   clipShader=GlTools::Shader::LoadProgram("/home/kern/shader/clipping_vs.txt","/home/kern/shader/clipping_ps.txt","/home/kern/shader/clipping_gs.txt");
   
   std::cout << "chargement OK" << std::endl;
   
   glProgramParameteriEXT(clipShader, GL_GEOMETRY_INPUT_TYPE_EXT, GL_LINES_ADJACENCY_EXT);

   if (glGetError()==GL_INVALID_VALUE)
      std::cout << "erreur" << std::endl;

   glProgramParameteriEXT(clipShader, GL_GEOMETRY_OUTPUT_TYPE_EXT, GL_TRIANGLES);
   glProgramParameteriEXT(clipShader, GL_GEOMETRY_VERTICES_OUT_EXT, 12);
   
   glLinkProgram(clipShader);

   monPlan=Atlantis::getClippingPlane();
   
   glUseProgram(clipShader);

   px=glGetUniformLocation(clipShader, "clipX");
   py=glGetUniformLocation(clipShader, "clipY");
   pz=glGetUniformLocation(clipShader, "clipZ");
   pnx=glGetUniformLocation(clipShader, "clipXn");
   pny=glGetUniformLocation(clipShader, "clipYn");
   pnz=glGetUniformLocation(clipShader, "clipZn");
   pv=glGetUniformLocation(clipShader, "clipV");
   scaleFactor=glGetUniformLocation(clipShader, "scale");
   
   glUniform1f(scaleFactor,0.1f);
   glUseProgram(0);


merci d'avance
95% des problèmes informatiques se situent entre la chaise et le clavier
--> Créez votre robot chien : http://doggyproject.free.fr/
--> Gagnez des PACK+ gratuitement : http://www.packbarre.com/
--> S.U.S Tennis de table http://www.sus.asso.fr
Avatar de l’utilisateur
deathangel
Hello World, I'm new !
 
Messages: 963
Inscription: 10 Avr 2005, 08:50
Localisation: Strasbourg

Messagepar deathangel » 19 Juin 2009, 15:49

Désolé pour le dérangement, je viens de trouver mon erreur.

En fait je linkais déjà mon shader dans mon LoadProgram sans lui avoir mis les paramètres d'entrée et sortie. Et le hasard faisant bien les choses dans l'ancien driver c'était initialisé à une valeur qui faisait que ca plante pas.

Conclusion : toujours initialisé les valeurs par défaut même si il parait que c'est standardisé, les standards évoluent
95% des problèmes informatiques se situent entre la chaise et le clavier
--> Créez votre robot chien : http://doggyproject.free.fr/
--> Gagnez des PACK+ gratuitement : http://www.packbarre.com/
--> S.U.S Tennis de table http://www.sus.asso.fr
Avatar de l’utilisateur
deathangel
Hello World, I'm new !
 
Messages: 963
Inscription: 10 Avr 2005, 08:50
Localisation: Strasbourg

Messagepar Benos » 19 Juin 2009, 16:16

Compliqué les shaders :00000010:

Il rend bien ton modèle de Phong par rapport à l'éclairage d' Opengl ?
Benos
Hello World, I'm new !
 
Messages: 271
Inscription: 20 Oct 2005, 14:22

Messagepar deathangel » 19 Juin 2009, 16:50

Image

Image

ca ne fait pas une image continue car j'ai besoin d'afficher mes tetraedres pour voir ce qui se passe à l'intérieur donc l'éclairage n'est pas tout à fait exact, mais ca donne une idée du rendu

Image

edit : et le même shader sur une surface complète

et un peu de pub si vous voulez voir tout ce qu'on fait au labo : https://lsiit.u-strasbg.fr/igg-fr/index.php/Galerie_Vid%C3%A9o :)
95% des problèmes informatiques se situent entre la chaise et le clavier
--> Créez votre robot chien : http://doggyproject.free.fr/
--> Gagnez des PACK+ gratuitement : http://www.packbarre.com/
--> S.U.S Tennis de table http://www.sus.asso.fr
Avatar de l’utilisateur
deathangel
Hello World, I'm new !
 
Messages: 963
Inscription: 10 Avr 2005, 08:50
Localisation: Strasbourg

Messagepar Benos » 19 Juin 2009, 17:18

Effectivement c'est vraiment joli. J'avais de mauvais échos à propos du modèle de Phong car sa théorie est assez empirique, mais ça en jette quand même. Je crois qu'un de ses défauts est le fait que la lumière spéculaire n'est pas atténuée (les tâches de réflexion spéculaires sur la statue sont un peu trop blanches).
Benos
Hello World, I'm new !
 
Messages: 271
Inscription: 20 Oct 2005, 14:22

Messagepar deathangel » 20 Juin 2009, 00:19

pour les taches spéculaires, tout dépend de la facon dont tu as configuré ton matériel en opengl. A priori j'ai pas eu le problème que tu me dis à priori (enfin il me semble) mais je n'ai que tester une petite partie des possibilités.
L'éclairage phong nous sert surtout à déceler des anomalies sur les surfaces (vu qu'on travaille sur de la reconstruction de maillage), si un sommet est mal défini ou autre, ca se voit tout de suite
95% des problèmes informatiques se situent entre la chaise et le clavier
--> Créez votre robot chien : http://doggyproject.free.fr/
--> Gagnez des PACK+ gratuitement : http://www.packbarre.com/
--> S.U.S Tennis de table http://www.sus.asso.fr
Avatar de l’utilisateur
deathangel
Hello World, I'm new !
 
Messages: 963
Inscription: 10 Avr 2005, 08:50
Localisation: Strasbourg

Messagepar Benos » 20 Juin 2009, 13:10

En fait le "défaut" que j' évoque c'est au niveau de la théorie du modèle de Phong . Si tu préfères le modèle de Phong repose sur des bases physiques (réflexion spéculaire,modèle de microfacettes etc...) moins rigoureuses que d'autres modèles. L'avantage de Phong c'est que le temps de calcul est (beaucoup) moins important que ces autres modèles physiquement rigoureux, tout en donnant des résultats agréables. Je ne pense pas qu'il y ai de problèmes au niveau de ta réalisation (en même temps je peux pas trop te dire j'ai surtout étudié ces modèles en bossant sur du raytracing et non sur des shaders :00000030: ).

Sinon, je vois que vous vous amusez bien dans votre labo :00000032: , c'est vraiment bluffant le mouvement des liquides, je vois pas comment c'est possible de faire ça.
Benos
Hello World, I'm new !
 
Messages: 271
Inscription: 20 Oct 2005, 14:22

Messagepar deathangel » 20 Juin 2009, 19:13

Pour le mouvement des liquides, en fait ce sont des flots de particules qui interagissent les unes avec les autres. Chacune a une distance de poussée qui l'empêche de trop se rapprocher des autres, ce qui fait un effet de glissement. Elles réagissent ensuite selon les lois physiques de collision toute bête.

Au final c'est le rendu qui fait que ca rend joli avec un marching cube sur l'ensemble des particules. Ca permet de faire une jolie surface que t'as juste à passer dans un raytracer (povray en l'occurence)
95% des problèmes informatiques se situent entre la chaise et le clavier
--> Créez votre robot chien : http://doggyproject.free.fr/
--> Gagnez des PACK+ gratuitement : http://www.packbarre.com/
--> S.U.S Tennis de table http://www.sus.asso.fr
Avatar de l’utilisateur
deathangel
Hello World, I'm new !
 
Messages: 963
Inscription: 10 Avr 2005, 08:50
Localisation: Strasbourg

Messagepar Benos » 20 Juin 2009, 20:26

D'accord! La seule possibilité que je voyais c'était de simuler le liquide avec un maillage mais cela ne permet pas de faire tout ce qu'on voit dans les vidéos. Merci pour l'explication. :00000025:
Benos
Hello World, I'm new !
 
Messages: 271
Inscription: 20 Oct 2005, 14:22


Retourner vers Programmation

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 3 invités

cron