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 :

Rendu de scène


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2006
    Messages
    166
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Décembre 2006
    Messages : 166
    Par défaut Rendu de scène
    Voilà, je vais prendre un exemple simple... j'ai un gros cube dessiné tout en blanc dans ma scène...
    Je voudrais faire un éclairage correcte dessus pour avec un rendu avec différentes teintes sur chaque face de celui-ci... comment faire ???

    car actuellement j'ai juste une lumière qui suit la caméra de la façon suivante... et le rendu est plus que mauvais...

    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
     
    int			LightPos[4] = {0, 0, 0, 1};
    int			MatSpec[4] = {1, 1, 1, 1};
    ....
    resize
    ....
    	// set correspondence between window and OGL viewport
    	glViewport(0, 0, cx, cy);
    	glMatrixMode(GL_PROJECTION);
    	glLoadIdentity();
    	gluPerspective(45, float(cx)/float(cy), 0.01, 1000);
            glMatrixMode(GL_MODELVIEW);
    ....
    init
    ....
    	glEnable(GL_DEPTH_TEST);
    	glEnable(GL_POLYGON_SMOOTH);
    	glEnable(GL_LINE_SMOOTH);
    	glEnable(GL_POINT_SMOOTH);
    	glEnable(GL_LIGHTING);
    	glEnable(GL_LIGHT0);
    .....
    draw
    .....
    	glMaterialiv(GL_FRONT_AND_BACK, GL_SPECULAR, MatSpec);
    	glMateriali(GL_FRONT_AND_BACK, GL_SHININESS, 100);
    	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    	glLoadIdentity();
    	glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, 1);
    	glLightiv(GL_LIGHT0, GL_POSITION, LightPos);
    	gluLookAt(cam.x, cam.y, cam.z, ref.x, ref.y, ref.z, up.x, up.y, up.z);
     
            dessin de mes elements....

  2. #2
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 3
    Par défaut
    Es-ce que tu pourrais poster le code correspondant au rendu de ton cube?

  3. #3
    Membre confirmé
    Inscrit en
    Décembre 2006
    Messages
    166
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Décembre 2006
    Messages : 166
    Par défaut
    j'y suis presque arrivé.. j'ai rajouter les normal en chaque face... du coup l'éclairage est mieux rendu.

    même si c'est pas top top...

    voilà le code :
    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
     
    void CMyViewGL::OnCreateGL()
    {
      glClearColor(0.0F,0.0F,0.0F,1.0F);
      glEnable(GL_LIGHTING);
      glEnable(GL_LIGHT0);
      glEnable(GL_AUTO_NORMAL);
      glEnable(GL_NORMALIZE);
      glDepthFunc(GL_LESS);
      glEnable(GL_DEPTH_TEST);
    }
     
    void CMyViewGL::OnDrawGL()
    {
    	GLfloat		LightPos[4] = {0.0f, 0.0f, 0.0f, 1.0f};
    	GLfloat		Diffuse[4]  = {0.8f, 0.8f, 0.8f, 1.0f};
    	GLfloat		Specular[4] = {1.0f, 1.0f, 1.0f, 1.0f};
    	GLfloat		Ambient[4]  = {0.5f, 0.5f, 0.5f, 1.0f};
     
    	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
     
    	glMatrixMode(GL_MODELVIEW);
    	glLoadIdentity();
        //Light position
    	glLightfv(GL_LIGHT0, GL_DIFFUSE,  Diffuse);
    	glLightfv(GL_LIGHT0, GL_SPECULAR, Specular);
    	glLightfv(GL_LIGHT0, GL_AMBIENT,  Ambient);
    	glLightfv(GL_LIGHT0, GL_POSITION, LightPos);
     
    	gluLookAt(cam.x, cam.y, cam.z, ref.x, ref.y, ref.z, up.x, up.y, up.z);
     
    	if (pc->Gr3DHLMode == Gr3D_HL)
    		glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
    	else
    		glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
     
    	glColor4f(1.0f, 1.0f, 1.0f, 1.0f);	
    	glLineStipple(1, 0xFFFF);
    	glLineWidth(1.0);
     
    	// Draw Element
    	Draw();
    }
     
    void CMyViewGL::OnSizeGL(int cx, int cy) 
    {
    	// set correspondence between window and OGL viewport
    	glViewport(0, 0, cx, cy);
     
    	glMatrixMode(GL_PROJECTION);
     
    	glLoadIdentity();
     
    	gluPerspective(45, float(cx)/float(cy), 0.01, 1000);
    }
    La fonction Draw fait que des glBegin(GL_TRIANGLES ... GL_POLYGON....etc.) glEnd()
    avec des glNormal3f pour chaque facette dessinée... et la saisie de tous les glVertex3f().

    suite à ça j'ai toujours quelques questions :

    - est-ce possible d'avoir un meilleur rendu de lumière ?
    - quand j'active la couleur (glEnable(GL_COLOR_MATERIAL)).. l'éclairage de la scène est redevenu tout dégueulasse... comme faire ?
    - Je voudrait faire bouger ma scéne avec la souris... par contre de tout redessiner ça lag pas mal... est possible de rafraichir l'écran en effectuant juste le gluLookAt (étant donné que c'est ma caméra qui bouge) sans redessiner tous mes éléments...
    - Enfin.. quand je bouge la caméra (avec gluLookAt) la lumière ne suis pas le mouvement.. car je veux qu'elle soit au niveau de la caméra, comment faire ?

    NB... j'ai une appli MFC.. et j'utilise le code CGLEnabledView... trouvé sur le net pour intégrer OpenGL à mon appli MFC

    Merci d'avance

  4. #4
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 41
    Par défaut
    Je vais te répondre avec mes connaissances mais il se peut que je me trompe !

    est-ce possible d'avoir un meilleur rendu de lumière ?
    Les shaders sont super pour ca ! Sur site tu trouveras quelques exemples sympa :http://www.lighthouse3d.com/opengl/glsl/
    (sauf que c'est en anglais)


    quand j'active la couleur (glEnable(GL_COLOR_MATERIAL)).. l'éclairage de la scène est redevenu tout dégueulasse... comme faire ?
    Je ne sais pas pouquoi ca redeviens bizar mais tu peux utiliser les matériaux à la place des couleur de vertex ! (gl_material je crois)


    Je voudrait faire bouger ma scéne avec la souris... par contre de tout redessiner ça lag pas mal... est possible de rafraichir l'écran en effectuant juste le gluLookAt (étant donné que c'est ma caméra qui bouge) sans redessiner tous mes éléments...
    Les display list servent justement à ca et elles sont très facile à utiliser !
    Tu calcules ta scenes une seule fois et tu la mets dans une display list ensuite tu n'as qu'a rappeler cette liste après avoir changer ta vue avec gluLookAt.

    Voila j'espère que ca va t'aider !

  5. #5
    Membre Expert
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 582
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 582
    Par défaut
    Citation Envoyé par skalimer0 Voir le message
    j'y suis presque arrivé.. j'ai rajouter les normal en chaque face... du coup l'éclairage est mieux rendu.
    ah oui forcément, les normales c'est ce qui va permettre de calculer l'influence de la lumière
    elles sont donc obligatoires

    - est-ce possible d'avoir un meilleur rendu de lumière ?
    - quand j'active la couleur (glEnable(GL_COLOR_MATERIAL)).. l'éclairage de la scène est redevenu tout dégueulasse... comme faire ?
    - Je voudrait faire bouger ma scéne avec la souris... par contre de tout redessiner ça lag pas mal... est possible de rafraichir l'écran en effectuant juste le gluLookAt (étant donné que c'est ma caméra qui bouge) sans redessiner tous mes éléments...
    - Enfin.. quand je bouge la caméra (avec gluLookAt) la lumière ne suis pas le mouvement.. car je veux qu'elle soit au niveau de la caméra, comment faire ?
    - pour un meilleur rendu de lumière, il y a plusieurs possibilités : augmenter le nombre de faces enfin plutot de sommets vu que la gestion de la lumière par opengl se fait sur les sommets, utiliser la technique de projection de texture "le lightmapping", utiliser des shaders mais il faut que la carte les supporte
    - glEnable(GL_COLOR_MATERIAL) n'active pas la couleur mais les matérials. si tu actives le matérial tu désactive la couleur, il faut utiliser des matérial pour définir tes surfaces à la place des glColor...
    - tout ce que tu dessines doit être redessiné à chaque image, si tu bouges la caméra tu dois tout recalculer et tout redessiner, il n'y a pas de miracle ça a toujours fonctionné comme ça
    - si tu veux que ta lumière soit au niveau de la caméra il faut lui faire subir les mouvements de la caméra

    question rapidité, comme le dit render-nick, tu peux accélérer les calculs de rendu pour ta scène en utilisant des display-list pour tes objets
    si ta carte le permet tu peux aller jusqu'aux VBO
    il y a déjà eu pas mal de discutions sur le forum à ce sujet, tu devrais trouver ton bonheur
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

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

Discussions similaires

  1. WebGL : Effectuer le rendu d'une scène dans une texture
    Par LittleWhite dans le forum Développement 2D, 3D et Jeux
    Réponses: 0
    Dernier message: 19/08/2013, 21h56
  2. Irrlicht 3D : effectuer le rendu de la scène dans une fenêtre Win32
    Par LittleWhite dans le forum Développement 2D, 3D et Jeux
    Réponses: 0
    Dernier message: 30/05/2013, 21h14
  3. Irrlicht 3D : effectuer le rendu de la scène dans une texture
    Par LittleWhite dans le forum Développement 2D, 3D et Jeux
    Réponses: 0
    Dernier message: 27/05/2013, 19h59
  4. Réponses: 9
    Dernier message: 11/07/2011, 14h57
  5. Un objet rendu apparaît derrière un autre objet
    Par jamal24 dans le forum OpenGL
    Réponses: 2
    Dernier message: 01/05/2003, 20h47

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