#1 Le 08/08/2008, à 10:09
- xcxl
[RESOLU][QT/OpenGL] Pixels : Rendu de la scene vraiment médiocre...
Bonjour à tous!
Je suis donc en train de programmer une scene 3D en opengl et à l'aide de la librairie QT pour contenir la scène. Dans l'ensemble ca marche très bien mais il semble qu'il y ait quand même un petit problème d'affichage comme vous pouvez le voir au niveau du sol qui se déforme avec la distance et la qualité médiocre de l'affichage :
Le code de la scene (celui qui crée les deux widget de l'affichage) , j'ai surement fait une erreur pour les appels opengl (je suis encore assez mauvais avec cette librairie...)??
Pour petite explication l'ordre d'appel des fonctions est:
-NouvelEcran::NouvelEcran(QWidget *parent, int largeur, int hauteur)
-void NouvelEcran::initializeGL()
-void NouvelEcran::resizeGL(int width, int height)
-void NouvelEcran::paintGL()
-void NouvelEcran::draw(int rotationX)
(au fait la progressbar ne sert à rien mdr)
#include "Vues.h"
NouvelEcran::NouvelEcran(QWidget *parent, int largeur, int hauteur) : QGLWidget(parent)
{
rotationCube = 0;
setFixedSize(largeur, hauteur);
setFormat(QGLFormat(QGL::DoubleBuffer | QGL::DepthBuffer));
}
void NouvelEcran::initializeGL()
{
qglClearColor(Qt::black);
glEnable(GL_DEPTH_TEST);
glEnable(GL_TEXTURE_2D);
GLfloat fogColor[4]= {0.5f, 0.5f, 0.5f, 1.0f};
glClearColor(0.5f,0.5f,0.5f,1.0f); // We'll Clear To The Color Of The Fog ( Modified )
glFogi (GL_FOG_MODE, GL_LINEAR);
glFogfv(GL_FOG_COLOR, fogColor); // Set Fog Color
glFogf(GL_FOG_DENSITY, 0.1f); // How Dense Will The Fog Be (just for le mode LINEAR
glHint(GL_FOG_HINT, GL_DONT_CARE); // Fog Hint Value
glFogf(GL_FOG_START, 25.0f); // Fog Start Depth
glFogf(GL_FOG_END, 30.0f); // Fog End Depth
glEnable(GL_FOG); // Enables GL_FOG
//Texture
textures[0] = bindTexture(QPixmap(QString("stainedglass05.png")));
textures[1] = bindTexture(QPixmap(QString("veg034.png")));
textures[2] = bindTexture(QPixmap(QString("metal091.png")));
textures[3] = bindTexture(QPixmap(QString("wall009.png")));
textures[4] = bindTexture(QPixmap(QString("window001.png")));
}
void NouvelEcran::resizeGL(int width, int height)
{
glViewport(0, 0, width, height);
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
gluPerspective(70,(double)800/600,1,1000);
glMatrixMode(GL_MODELVIEW);
}
void NouvelEcran::paintGL()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
draw();
}
void NouvelEcran::draw(int rotationX)
{
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(6,8,10,0,0,0,0,0,1);
//sol
glBindTexture(GL_TEXTURE_2D, textures[2]);
glBegin(GL_QUADS);
glTexCoord2d(0,30); glVertex3d(-30,-30,-1);
glTexCoord2d(0,0); glVertex3d(-30,30,-1);
glTexCoord2d(30,0); glVertex3d(30,30,-1);
glTexCoord2d(30,30); glVertex3d(30,-30,-1);
glEnd();
//mur
glBindTexture(GL_TEXTURE_2D, textures[3]);
glBegin(GL_QUADS);
glTexCoord2d(0,30); glVertex3d(-10,-30,-1);
glTexCoord2d(0,0); glVertex3d(-10,30,-1);
glTexCoord2d(30,0); glVertex3d(-10,30,30);
glTexCoord2d(30,30); glVertex3d(-10,-30,30);
glEnd();
//fenetre
glBindTexture(GL_TEXTURE_2D, textures[4]);
glBegin(GL_QUADS);
glTexCoord2d(0,1); glVertex3f(-9.9,-3,5);
glTexCoord2d(0,0); glVertex3f(-9.9,3,5);
glTexCoord2d(1,0); glVertex3f(-9.9,3,10);
glTexCoord2d(1,1); glVertex3f(-9.9,-3,10);
glEnd();
//Cube
glPushMatrix();
rotationCube+=2;
glRotated(rotationCube,0,0,1);
glBindTexture(GL_TEXTURE_2D, textures[0]);
glBegin(GL_QUADS);
glTexCoord2d(0,1); glVertex3d(1,1,1);
glTexCoord2d(0,0); glVertex3d(1,1,-1);
glTexCoord2d(1,0); glVertex3d(-1,1,-1);
glTexCoord2d(1,1); glVertex3d(-1,1,1);
glTexCoord2d(0,1); glVertex3d(1,-1,1);
glTexCoord2d(0,0); glVertex3d(1,-1,-1);
glTexCoord2d(1,0); glVertex3d(1,1,-1);
glTexCoord2d(1,1); glVertex3d(1,1,1);
glTexCoord2d(0,1); glVertex3d(-1,-1,1);
glTexCoord2d(0,0); glVertex3d(-1,-1,-1);
glTexCoord2d(1,0); glVertex3d(1,-1,-1);
glTexCoord2d(1,1); glVertex3d(1,-1,1);
glTexCoord2d(0,1); glVertex3d(-1,1,1);
glTexCoord2d(0,0); glVertex3d(-1,1,-1);
glTexCoord2d(1,0); glVertex3d(-1,-1,-1);
glTexCoord2d(1,1); glVertex3d(-1,-1,1);
glTexCoord2d(0,1); glVertex3d(1,1,-1);
glTexCoord2d(0,0); glVertex3d(1,-1,-1);
glTexCoord2d(1,0); glVertex3d(-1,-1,-1);
glTexCoord2d(1,1); glVertex3d(-1,1,-1);
glTexCoord2d(0,1); glVertex3d(1,-1,1);
glTexCoord2d(0,0); glVertex3d(1,1,1);
glTexCoord2d(1,0); glVertex3d(-1,1,1);
glTexCoord2d(1,1); glVertex3d(-1,-1,1);
glEnd();
glPopMatrix();
//Pyramide
//glTranslated(-5,decalage,0);
glBindTexture(GL_TEXTURE_2D, textures[1]);
glBegin(GL_TRIANGLES);
glTexCoord2d(0,0); glVertex3d(1,1,-1);
glTexCoord2d(1,0); glVertex3d(-1,1,-1);
glTexCoord2d(0.5,1); glVertex3d(0,0,1);
glTexCoord2d(0,0); glVertex3d(1,-1,-1);
glTexCoord2d(1,0); glVertex3d(1,1,-1);
glTexCoord2d(0.5,1); glVertex3d(0,0,1);
glTexCoord2d(0,0); glVertex3d(-1,-1,-1);
glTexCoord2d(1,0); glVertex3d(1,-1,-1);
glTexCoord2d(0.5,1); glVertex3d(0,0,1);
glTexCoord2d(0,0); glVertex3d(-1,-1,-1);
glTexCoord2d(1,0); glVertex3d(-1,1,-1);
glTexCoord2d(0.5,1); glVertex3d(0,0,1);
glEnd();
}
Merci!
EDIT: Je fait des recherches du coté de l'antialiasing openGL, mais jai bcp de mal à le faire marcher, pour objet de type GL_QUADS il faut utiliser la fonction glEnable( GL_POLYGON_SMOOTH ) ?
Dernière modification par xcxl (Le 09/08/2008, à 16:05)
Hors ligne
#2 Le 08/08/2008, à 16:52
- Eldermê
Re : [RESOLU][QT/OpenGL] Pixels : Rendu de la scene vraiment médiocre...
Je fait des recherches du coté de l'antialiasing openGL, mais jai bcp de mal à le faire marcher, pour objet de type GL_QUADS il faut utiliser la fonction glEnable( GL_POLYGON_SMOOTH ) ?
Il vaut mieux utiliser le multisampling (multi-échantionnage dans la langue de Molière). Je sais comment on fait avec SDL, mais dans ton cas, je ne sais pas. Essais de chercher plutôt de ce côté. Forcer l'anti-aliasing dans les pilotes de ta carte graphique fonctionne aussi.
Pour les textures moches au fond, essais peut-être (là, je ne promets rien) un :
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
devrait peut-être améliorer.
Si c'est toujours moche, regarde du côté des mipmaps (c'est un petit peu plus compliqué à mettre en oeuvre).
Dernière modification par Eldermê (Le 08/08/2008, à 16:53)
Mon blog : petit projet de jeux en 3D (libres, bien sûr).
Hors ligne
#3 Le 08/08/2008, à 16:57
- nicolas66
Re : [RESOLU][QT/OpenGL] Pixels : Rendu de la scene vraiment médiocre...
Essayes ca pour les polygones
glEnable(GL_POLYGON_SMOOTH);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
Pour les textures, la commande `glTexParameter' ne permet que de faire un lissage linéaire. Tu peux éventuellement faire un lissage bilinéaire par shader ou faire du post-processing via les fbo.
Dernière modification par nicolas66 (Le 08/08/2008, à 17:00)
"The computer was born to solve problems that did not exist before." (B. Gates)
Hors ligne
#4 Le 08/08/2008, à 17:02
- Eldermê
Re : [RESOLU][QT/OpenGL] Pixels : Rendu de la scene vraiment médiocre...
nicolas66, ta méthode nécessite de tracer les polygones dans un ordre précis, en commençant par les plus lointains. Sinon, ça ne donnera pas le résultat attendu. Ça devient très galère à mettre en oeuvre dès qu'on autorise les changement de caméra. C'est pour ça que je recommande plutôt le multisampling.
Mon blog : petit projet de jeux en 3D (libres, bien sûr).
Hors ligne
#5 Le 08/08/2008, à 23:07
- xcxl
Re : [RESOLU][QT/OpenGL] Pixels : Rendu de la scene vraiment médiocre...
Va pour le multi sampling^^. J'essaye de le mettre en place et je vous transmet le résultat!
(étant donné que la camera ne va pas arreter de se déplacer pendant l'execution...)
Dernière modification par xcxl (Le 08/08/2008, à 23:08)
Hors ligne
#6 Le 09/08/2008, à 09:23
- robrob
Re : [RESOLU][QT/OpenGL] Pixels : Rendu de la scene vraiment médiocre...
Comme te l'a suggéré Eldermê commence déjà par filtrer tes textures. Rien qu'un simple mipmapping améliorera nettement le rendu.
Exemple trouvé sur google avec/sans mipmapping:
http://www.flipcode.com/archives/Advanced_OpenGL_Texture_Mapping.shtml
De plus, si tu ne filtres pas tes textures, le multisampling n'améliorera pas grand chose.
Hors ligne
#7 Le 09/08/2008, à 16:04
- xcxl
Re : [RESOLU][QT/OpenGL] Pixels : Rendu de la scene vraiment médiocre...
En effet il faut du mipmapping! Hélas la fonction bindTexture de QT ne le permet pas!
J'ai finalement utilisé la fonction load() de QImage (je sais cest bete mé fallait y penser...)
Merci quand meme pour votre aide, la fonction que jai écrite pour le chargement des textures est là : http://www.siteduzero.com/forum-83-307520-2837755-qt-opengl-pas-d-anti-aliasing.html#r2837755
Hors ligne