begin process at 2012 05 30 12:21:12
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Linux

 > 

OpenGL

 > 

Superposition OpenGL


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Superposition OpenGL

mercredi 30 janvier 2008 à 13:22:21 | Superposition OpenGL

mush74

Je cherche a développer un petit programme en C/C++ sous OpenGL (2D uniquement) et GLUT qui représente un altimètre. Dans ce type d'objet, il y a un fond fixe (cadran, graduation,...) et des objets en mouvements (aiguilles).

Cela fonctionne correctement mais les ressources CPU sont trop importantes, en partie a cause du fait que le programme doit redessiner constamment les éléments fixes et les éléments mobiles, alors que seul les éléments mobiles devraient l'être.

Connaissez vous une méthode qui permette soit de placer un fond d'écran (image fixe) ou bien de créer une sorte de calque qui ne serait dessiné qu'une fois sur lequel serait appliqué la partie contenant le dessin des éléments mobiles ? Cela permettrait de ne travailler qu'au niveau de la mémoire et éviter des tas d'opérations mathématiques coûteuses (j'utilise des cercles dans la partie fixe).

Merci

Romuald

mercredi 30 janvier 2008 à 18:39:04 | Re : Superposition OpenGL

luhtor

Non, c'est pas du au fait que tu redessines tout, c'est du à la facon dont tu affiches tes éléments. Post un peu de code de ta partie d'affichage. Il faut également ajouter un timer pour éviter que le fps ne soit trop élevé si tu n'utilises pas la synchro verticale.
mercredi 30 janvier 2008 à 22:54:59 | Re : Superposition OpenGL

mush74

Voici un bout de code. Je suis newbie en C et openGL et pour couronner le tout je développe dans le RER...alors un peu d'indulgence svp ;-) pour résumer, j'affiche une fenetre GLUT avec un fond de couleur. J'ajoute 6 cadrans de fond noir. La méthode employée n'est d'ailleurs pas élégante, mais j'ai pas trouvé mieux... Puis sur tout cela, je fait varier ici des graduations (ce n'est pas une aiguille sur ce bout de code, mais le principe est le même). luhtor, tes remarques semblent interressantes, mais je n'ai pas du tout entendu parlé de timer ni de synchro verticale dans les docs que j'ai pu me procurer sur le net. Si tu as des infos...voire un bout de code qui explique ce principe... int main(int argc, char **argv) { glutInitWindowSize(HSIZE, VSIZE); glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); glutInitWindowPosition(0, 0); glutCreateWindow("EFIS"); glutInit(); glutDisplayFunc(efis_run); glutKeyboardFunc(capteurs); glutIdleFunc(data_process); glutReshapeFunc(reshape); glutMainLoop(); return 0; } // Fonction data_process : Simule l'entrée de signaux des capteurs void data_process() { cap+=8; //ajout de +8° (tests) efis_cap_move(cptposH[cap_pos], cptposV[cap_pos], CPT_SIZE, cap); glutPostRedisplay(); glutSwapBuffers(); } // Fonction efis_run : Affichage de l'EFIS void efis_run() { efis_background(); glutSwapBuffers(); } // Fonction glutInit : Initialisation fenêtre GLUT void glutInit(void) { glShadeModel (GL_SMOOTH); glEnable (GL_LINE_SMOOTH); glEnable (GL_POLYGON_SMOOTH); glEnable (GL_BLEND); glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glHint (GL_LINE_SMOOTH_HINT, GL_NICEST); glClear (GL_COLOR_BUFFER_BIT); } void reshape (int width, int height) { GLfloat w, h; glViewport(0, 0, width, height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); if (width > height) { w = (6.0 * width) / height; h = 6.0; } else { w = 6.0; h = (6.0 * height) / width; } glOrtho(-w, w, -h, h, -1, 1); glutPostRedisplay(); } void efis_background() { glPushMatrix(); glClearColor(0.8, 0.8, 0.8, 0.0); glClear(GL_COLOR_BUFFER_BIT); efisCircle(0 , 10/3 , CPT_SIZE, CPT_WIDTH); efisCircle(-5, 10/3 , CPT_SIZE, CPT_WIDTH); efisCircle(5, 10/3 , CPT_SIZE, CPT_WIDTH); efisCircle(0 , -10/3 , CPT_SIZE, CPT_WIDTH); efisCircle(5, -10/3 , CPT_SIZE, CPT_WIDTH); efisCircle(-5, -10/3 , CPT_SIZE, CPT_WIDTH); glPopMatrix(); } // efisGrad : Draw graduations void efisGrad(float x,float y,float r, float w, int g, int degStart, int degEnd) { float angle,x1,x2,y1,y2,incg; if (degStart > degEnd) { incg = ((360-degStart)+degEnd)/(g-1); } else { incg = (degEnd-degStart)/(g-1); } if (degStart > degEnd) degStart = degStart-360; // Graduations principales glLineWidth(w); glColor3f(1.0,1.0,1.0); glBegin(GL_LINES); for (angle=degStart;angle<=degEnd;angle+=incg) { x1 = r*sin(angle/RAD)+x; y1 = r*cos(angle/RAD)+y; x2 = (r-0.2)*sin(angle/RAD)+x; y2 = (r-0.2)*cos(angle/RAD)+y; glVertex2f(x1,y1); glVertex2f(x2,y2); } glEnd(); // Graduations secondaires glLineWidth(w/2); glBegin(GL_LINES); for (angle=degStart;angle<=degEnd;angle+=incg/5) { x1 = r*sin(angle/RAD)+x; y1 = r*cos(angle/RAD)+y; x2 = (r-0.1)*sin(angle/RAD)+x; y2 = (r-0.1)*cos(angle/RAD)+y; glVertex2f(x1,y1); glVertex2f(x2,y2); } glEnd(); } void print_stroke_string(void* font, char* s) { if (s && strlen(s)) { while (*s) { glutStrokeCharacter(font, *s); s++; } } } void efis_cap_move(float x, float y, float r, float cap) { glPushMatrix(); glColor3f(1.0,1.0,1.0); efisGrad(x, y, r, CPT_WIDTH, 9, cap, 360+cap); glPopMatrix(); } // efisCircle : Draw circle Center = x,y Ray = r Width = w void efisCircle(float x,float y,float r, float w) { float angle,xc,yc; glLineWidth(w); glColor3f(1.0,1.0,1.0); glBegin(GL_LINE_STRIP); for (angle=0;angle<=360;angle+=0.1f) { xc = r*sin(angle/RAD)+x; yc = r*cos(angle/RAD)+y; glVertex2f(xc,yc); } glColor3f(0.0,0.0,0.0); glBegin(GL_LINE_STRIP); for (angle=0;angle<=360;angle+=0.1f) { xc = r*sin(angle/RAD)+x; yc = r*cos(angle/RAD)+y; glVertex2f(x,y); glVertex2f(xc,yc); } glEnd(); }
jeudi 31 janvier 2008 à 12:04:29 | Re : Superposition OpenGL

luhtor

Réponse acceptée !
Il faut bannir toutes les fonctions glBegin/End, glVertex*. Je sais pas combien de temps il faudra pour réussir à exterminer l'usage de ces fonctions. La première étape serait de virer tous les tutoriels d'openGL d'internet qui utilisent ces fonctions totalement dépassées. Elles vont disparaitre dans Opengl 3.0 et il est temps.

Faut utiliser la méthode décrite sur ce lien:
http://www.g-truc.net/article/vbo-fr.pdf
jeudi 31 janvier 2008 à 14:04:02 | Re : Superposition OpenGL

mush74

ok, je vais regarder ce lien. Pour info, j'ai besoin de faire tourner ce programme sur des équipements "light" (systemes embarqués), donc je ne peux pas m'appuyer sur des fonctionnalités supportées uniquement par des cartes video récentes. Je repost dès que j'ai du neuf
jeudi 31 janvier 2008 à 21:03:33 | Re : Superposition OpenGL

luhtor

Il ne s'agit pas d'extensions pour les cartes vidéo récentes. Il s'agit de la technique de base pour afficher des polygones. Le lien décrit l'utilisation des vbos, si tes équipements ne le possèdent, ils possèderont obligatoirement les Vertex Array (VA) qui sont vieux maintenant et qui restent tout de meme très rapide et surtout économise énormément les ressources processeur. Tu peux aussi aller voir du coté des Display List si tu bosses sur des vieilles version d'opengl qui sont un peu plus rapide que les VA et aussi rapide que les plus récents VBO (le lien).
jeudi 31 janvier 2008 à 22:10:17 | Re : Superposition OpenGL

mush74

ok, je regarde ça ce week end. Merci pour ton aide.
dimanche 3 février 2008 à 22:04:40 | Re : Superposition OpenGL

mush74

C'est fait. Merci luhtor, tes conseils étaient bons. J'ai retrouvé des perfs très acceptables et un taux d'utilisation CPU normal. Je banni les glVertex et j'utilise un timer !!! ;-)


Cette discussion est classée dans : opengl, partie, éléments, mobiles, superposition


Répondre à ce message

Sujets en rapport avec ce message

texture opengl [ par lapal ] salutje dois texturer une partie d' un fond marin(celui-ci etant affiche avec pleins de petits triangles). je n'arrive pas a texturer seulement une p OpenGL comment effacer une partie de l'ecran en gardant ce qu'il y a derriere? [ par dletozeun ] Bonjour Oui ma question est loin d'etre clair! Donc je precise: En fait j'affiche une map en 3D sous opengl avec devant une interface graphique elle TRAITEMENT D'IMAGE [ par Batman60 ] salut je cherche le moyen d'ajouter à une image des parties colorées ou transparentes exemple sur une image 1024X800    je voudrais la transformer en mauvaise qualite d'image OPENGL [ par oswa ] Bonjour, je suis entrain de réaliser un programmme en C++ sous windows qui utilise OPENGL, ce programme permet de dessiner de piéces mécamique à par opengl dessiner un demi-cylindre?? [ par edenrand ] Bonjour, je voudrais savoir s'il existe une fonction sous opengl pour dessiner des demis cylindre? opengl 3d dessiner une encoche sur un cylindre [ par edenrand ] Bonjour, je suis en train de réaliser un jeu de tir a l'arc en 3D avec opengl, et j'ai un souci pour dessiner la flèche: en gros j'ai créé un cylindre Visualisation d'un robot avec opengl en partant d'un fichier vrml [ par nablovic ] Bonjour, J'aimerais savoir comment faire pour réaliser une visualisation d'un robot manipulateur en utilisant OpenGL. Sachant qu'on a une géométrie 3 creer un viewer VRML sous OpenGL [ par nablovic ] salut tous le monde ; voila je veux réaliser un viewer VRML (en c++) pour lire un fichier.wrl avec openGL mais sans l'aide des MFC pourriez vous m'a pikcing opengl [ par znb ] salut, j veux savoir comment recuperer le dernier objet qu on clique dessus.j ai beau essayer sans aucuns resultat [color=red]SVP c urgent[/color][siz Extension de la classe array [ par sebisp ] Bon, ca y est je vais payer cher d'avoir préférer suivre les cours de math plutot que ceux d'info... Je dois construire une classe darray répondant à


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 5,507 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales