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 :

Pb shader GLSL


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 8
    Par défaut Pb shader GLSL
    Bonjour a tous!

    voila je n'y connais vraiment pas grand chose en Shader, j'ai rechercher des infos sur le web, et j'ai finalement pencher sur les GLSL.

    Mon but est d'utiliser les shaders pour une application qui tourne avec QT et OSG, c'est une interface pour charger des model 3D et faire des modification.

    - probleme certaine des faces ( issue du logiciel sketchup) sont inverser donc resorte noire dans le rendu GL. Je veu donc utiliser les shaders pour paré a ce problème.
    Nom : avant.JPG
Affichages : 87
Taille : 14,7 Ko
    pour le moment j'ai cree un .vert et un .frag qui me calcul un eclairage type phong dans le quel je ne tien pas compte du signe de la normal.

    J'ai ajouter mon shaders dans ma scene.

    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
    //shader
            osg::StateSet* pstateInit = node->getOrCreateStateSet();
    	osg::Program* m_pEclairageProgram;
    	osg::Shader*  m_pEclairageVertObj;
    	osg::Shader*  m_pEclairageFragObj;
    	std::vector< osg::ref_ptr<osg::Program> > _programList;
     
    	m_pEclairageProgram = new osg::Program();
    	m_pEclairageProgram->setName( "eclairage" );
    	m_pEclairageVertObj = new osg::Shader( osg::Shader::VERTEX );
    	m_pEclairageFragObj = new osg::Shader( osg::Shader::FRAGMENT );
    	_programList.push_back( m_pEclairageProgram );
     
    	bool ok = loadShaderSource( m_pEclairageVertObj, QFileInfo(qApp->argv()[0]).dir().filePath("data/shaders/MyVertexShader.vert").latin1()) 
    		 && loadShaderSource( m_pEclairageFragObj, QFileInfo(qApp->argv()[0]).dir().filePath("data/shaders/MyFragmentShader.frag").latin1()) ;
    	if(ok)
    	{
    		m_pEclairageProgram->addShader( m_pEclairageFragObj );
    		m_pEclairageProgram->addShader( m_pEclairageVertObj );
    		pstateInit->setAttributeAndModes(m_pEclairageProgram, osg::StateAttribute::ON);    
    	}
    Ok cela fait bien ce que je veu au niveau des normals mais parcontre je pert mes materiau et texture. L'objet devient uni-color.

    Nom : apres.JPG
Affichages : 74
Taille : 8,1 Ko

    Avez vous une idée ? sachant que je charge mon shader sur la racine de mon objet, et que il recupere la couleur de ce noeud pour l'appliquer partout.

    Faut il définir un shader au niveau de chaque feuille de mon model?

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    - probleme certaine des faces ( issue du logiciel sketchup) sont inverser donc resorte noire dans le rendu GL. Je veu donc utiliser les shaders pour paré a ce problème.
    Ca paraît bizarre de patcher ce genre de problème à l'affichage. Pourquoi ne pas corriger le modèle directement ?

    Sinon pour ton problème, il faudrait commencer par voir ces fameux shaders

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 8
    Par défaut
    Citation Envoyé par Laurent Gomila
    Ca paraît bizarre de patcher ce genre de problème à l'affichage. Pourquoi ne pas corriger le modèle directement ?

    Sinon pour ton problème, il faudrait commencer par voir ces fameux shaders
    Déja Bravo pour la vitesse de reponse

    alors Pourquoi ne pas corriger le modèle directement ? en faite c pour un bute professionnel pour permetre de charger n'importe quel objet ce qui fait que je n'ai pas un objet a corriger.
    Sinon j'avai essayer un methode semi automatique en parcourant mais node et en testant les intersection. probleme tres long et pas fiable.


    sinon voici le vertex shader

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    varying vec3 normal, eyeVec;
    void main(void)
    {
    	normal = gl_NormalMatrix * gl_Normal;
    	vec3 vVertex = vec3 ( gl_ModelViewMatrix*gl_Vertex);
    	eyeVec = -vVertex;
     
     	gl_Position = ftransform();
    }
    et le fragment 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
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    varying vec3 normal , eyeVec;
    void main()
    {
    	vec4 diffuse = vec4 (0.0);
    	vec4 specular = vec4 (0.0);
    	float att = 0.0;
    	vec3 norm = normalize ( normal );
     
    	vec3 	light = vec3( gl_LightSource[0].position.xyz + eyeVec );
    			light = normalize(light);
     
    	vec4 ambient = gl_FrontMaterial.ambient * gl_LightSource[0].ambient;
     
    	float NdotL = abs(dot ( norm , light ));
     
    	if (NdotL > 0.0)
    	{
    		diffuse = (gl_FrontMaterial.diffuse * gl_LightSource[0].diffuse * NdotL) + gl_FrontMaterial.emission;
    		diffuse = (diffuse + diffuse*gl_FrontMaterial.emission)/2.0;
     
    		vec3 eye = normalize (eyeVec);
    		vec3 refl = reflect ( -light, norm);
    		float spec = max( dot ( refl , eye ), 0.0 );
     
    		spec = pow( spec , gl_FrontMaterial.shininess );
    		specular = gl_FrontMaterial.specular * gl_LightSource[0].specular * spec;
     
    		float dist = length ( light );
    		att = 1.0 / (gl_LightSource[0].constantAttenuation + (gl_LightSource[0].linearAttenuation*dist) + (gl_LightSource[0].quadraticAttenuation*dist*dist) );
    	}
     
    	gl_FragColor = ambient + ( diffuse + specular) * att;
    }

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Je ne vois pas de texture dans tes shaders.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 8
    Par défaut
    oui je sais mais je veu deja relgler le probleme avec les materiaux pour apres passer au texture et chercher comment ca marche.

    car l'exemple que j'ai donner il n'y a aucune texture que des materiaux et pourtant je perd tout donc il y a un autre probleme.

  6. #6
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Tu peux déjà simplifier le shader, et par exemple sortir tour à tour directement les composantes de gl_FrontMaterial, pour voir s'il est bien transmis au shader. Ensuite si ça marche, tu peux reconstruire au fur et à mesure ton shader original et voir à quel moment ça ne marche plus.

    PS : NdotL sera toujours positif, puisque c'est une valeur absolue

Discussions similaires

  1. Problème d'implémentation de shader GLSL
    Par Marco17 dans le forum OpenGL
    Réponses: 18
    Dernier message: 25/11/2007, 11h34
  2. Réponses: 20
    Dernier message: 15/03/2007, 20h10
  3. Réponses: 2
    Dernier message: 05/07/2006, 12h09

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