|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 |
![]() ![]() ![]() Guillaume BelzBiochimiste Inscription : novembre 2008 Messages : 5 312 ![]() |
Bonjour,
Les processeurs graphiques (GPU) sont devenus en quelques années un des composants majeurs des ordinateurs. Leur puissance de calcul, en croissance constante, est souvent utilisée dans les jeux vidéos 3D pour permettre aux joueurs de s'immerger dans un environnement toujours plus réaliste et riche en détails. Mais la 3D est présente également dans d'autres types d'applications, par exemple pour la représentation de données scientifiques complexes. Qt fournit depuis quelques temps un module dédié à la 3D, intégré par défaut dans le SDK : le module QtOpenGL. Ce module fournit les éléments de base pour créer une vue OpenGL avec QGLWidget mais également des outils avancés comme la gestion des shaders avec QGLShader. De nombreuses personnes réclamaient un tutoriel sur le sujet. Voici la chose faite : La 3D avec le module OpenGL de Qt Se basant sur un exemple simple de heightmap, ce tutoriel décrit en détails la création d'une vue 3D, l'envoi de données aux GPU, la programmation des shaders, la gestion des lumières et des textures, la création de textures dynamiques (rendu off-screen) et l'affichage d'éléments 2D sur une vue 3D (overpainting). Ce tutoriel s'accompagne de plusieurs codes exemples, directement exécutables dans Qt Creator. Cette première partie sur la 3D sera suivie par une partie sur le calcul sur carte graphique (GPU Computing) avec OpenCL (en cours de relecture) puis une partie sur le module Qt3D, qui devrait être intégré dans Qt 4.8. D'autres chapitres seront progressivement ajoutés, en fonction des demandes (et de mes envies Si vous souhaitez participer à la rédaction de ce tutoriel en rédigeant un chapitre sur un sujet spécifique (par exemple, des techniques avancées en 3D avec les shaders), vous pouvez me contacter par MP. Bonne lecture.
__________________
Vous souhaitez rejoindre l'équipe de bénévoles qui fait vivre Developpez (traduction, rédaction, modération) ? Contactez moi par MP. Ma page personnelle avec la liste de mes articles - Mon blog sur le C++, Qt et les GPU. Je suis régulièrement sur le chat pour les questions C++/Qt. Apprendre Qt 5 : vidéos d'installation (YouTube), extraites du livre Créer des applications avec Qt 5. |
|
60
|
|
|
#2 |
|
Membre du Club
![]() Inscription : octobre 2006 Messages : 36 ![]() |
Super intéressant félicitation !
C'est assez rare de trouver des tutoriaux à jour sur le sujet, et encore plus des tutoriaux complets et pas simplement des bouts de codes, vous avez fait les 2 Bon courage et vivement la suite ! |
|
|
00
|
|
|
#3 |
|
Membre éprouvé
![]() ![]() Laurent RibonDéveloppeur multimédia Inscription : août 2008 Messages : 81 ![]() |
Merci pour ce superbe article !
Il est complet, détaillé et bien fait. ![]() Grâce à cet article, je vais mieux maîtriser l'utilisation de QtOpenGL. ![]() Juste une critique négative concernant la compatibilité du code de exemples : Le compilateur de Microsoft$ n'a pas connaissance de M_PI ![]() Donc, c'est dommage, mais il n'est pas possible de tester les exemples avec ce compilateur de ... Qui est malheureusement très utilisé.Donc, pour qu'un maximum de personnes puissent tester les exemples, je te conseillerais de modifier leures sources.
__________________
laumaya : Article [Introduction à GLC_lib]. Forum[GLC_lib] Projets [GLC_lib]; [GLC_Player] |
|
|
01
|
|
|
#4 |
|
Nouveau Membre du Club
![]() Michel Développeur informatique Inscription : juin 2011 Messages : 18 ![]() |
Hi!
Merci pour cet article qui semble tomber pile poil au moment où j'en ai besoin! La compilation des 4 sources proposées ne pose aucun problème. Cependant c'est à l'exécution que çà se gâte! OpenGL-minimal et OpenGL-buffers : ok OpenGL-shader (voir screenshot) : ko le "menu" est caché en partie sur les commandes proposées, seule la commande "espace" semble avoir un effet perceptible. OpenGL-offscreen (voir screenshot) : ko l'application avorte en générant un message OS : windows seven 32 bits Qt : version 4.7.0 |
|
|
00
|
|
|
#5 |
![]() ![]() ![]() Guillaume BelzBiochimiste Inscription : novembre 2008 Messages : 5 312 ![]() |
Hum... j'ai testé aussi Win 7 32b mais avec Qt 4.7.3 et MingW32 et ça fonctionnait.
Il faudra que je regarde. Tu as lancé en mode débug pour voir à ça plantait ?
__________________
Vous souhaitez rejoindre l'équipe de bénévoles qui fait vivre Developpez (traduction, rédaction, modération) ? Contactez moi par MP. Ma page personnelle avec la liste de mes articles - Mon blog sur le C++, Qt et les GPU. Je suis régulièrement sur le chat pour les questions C++/Qt. Apprendre Qt 5 : vidéos d'installation (YouTube), extraites du livre Créer des applications avec Qt 5. |
|
00
|
|
|
#6 | |
![]() ![]() ![]() ![]() Alexandre LaurentIngénieur développement logiciels Inscription : mai 2008 Messages : 10 372 ![]() |
Bonjour,
Excellent tuto que j'utilise pour un certain défi Citation:
Un exemple pour mes propos, c'est que les blocs glBegin() / glEnd() n'ont jamais existé dans OpenGL ES 1. Par contre, les Vertex Array existe (et je crois que dans cette version d'OpenGL ES c'est la seule méthode pour envoyer les données). Bien sur, l'utilisation des VBO est la meilleure des techniques Un autre point que je trouve contestable (mais je chipote facilement): c'est le code source. En effet j'utilise le tuto pour apprendre à faire un dessin OpenGL avec l'aide des classes de Qt. Dans le code source on se retrouve avec 4 méthodes de dessins mélangées dans le même source. Peut être aurait été il plus logique de faire de multiple classes ... (enfin, c'est vraiment du chipotage, je l'admet). Finalement, j'ai un problème sur ma machine. J'ai récemment installé Qt 4.7.3 sur un Windows XP. J'embarque une Geforce FX 5200 (oui, j'ai de très vieilles machines). Je me retrouve avec des bugs bizarres lors de l'écriture des infos de la scène (voir pièce jointe). Je dois dire, je n'ai pas cherché pour connaître la source du problème ...
__________________
Vous souhaitez participer à la rubrique 2D / 3D / Jeux ? Contactez-moi ![]() La rubrique a aussi un blog ! Ma page sur DVP Mon Portfolio Qui connaît l'erreur, connaît la solution. |
|
|
00
|
|
|
#7 |
![]() ![]() ![]() Guillaume BelzBiochimiste Inscription : novembre 2008 Messages : 5 312 ![]() |
Oui, j'avais pensé à faire le tour des fonctions utilisées et donner pour quelles versions d'OpenGL elles étaient disponibles.
En pratique, Qt crée un contexte par défaut (1.x sur windows je crois, ES 2 sur mobile, etc.) puis charge les fonctions dynamiquement. Donc, en gros, il suffit juste que la carte graphique prenne en charge la fonctionnalité, peut importe que contexte (qui est encapsulé de toute façon dans Qt). Et dans le cas où le fonctionnalité n'est pas supporté par la carte graphique, en général Qt réalise le travail en utilisant d'autres méthodes (par exemple en utilisant le Raster pour réaliser le rendu 2D) Pour le code source, je suis d'accord avec toi : on a codé pour mettre tous dans la même classe et ce n'est pas très respectueux de la POO. A ne pas reproduire en vrai. Par contre, pour un tutoriel, c'était mieux de rassembler le code similaire ensemble. Pour le bug avec la Geforce FX 5200, je pense à une fonctionnalité non prise en charge et utilisation du rendu en mode "dégradé" (normalement, Qt converti le dessin 2D en directive 3D dans un contexte OpenGL, pour ne pas avoir à changer de contexte ; sauf si les fonctionnalités ne sont pas dispo) Merci pour les critiques. Ce n'est pas un tutoriel destiné à ne plus changer. On complétera/corrigera en fonction des remarques
__________________
Vous souhaitez rejoindre l'équipe de bénévoles qui fait vivre Developpez (traduction, rédaction, modération) ? Contactez moi par MP. Ma page personnelle avec la liste de mes articles - Mon blog sur le C++, Qt et les GPU. Je suis régulièrement sur le chat pour les questions C++/Qt. Apprendre Qt 5 : vidéos d'installation (YouTube), extraites du livre Créer des applications avec Qt 5. |
|
10
|
|
|
#8 | ||
![]() ![]() ![]() ![]() Alexandre LaurentIngénieur développement logiciels Inscription : mai 2008 Messages : 10 372 ![]() |
Citation:
La réponse des contextes ne me plait guère. Tout d'abord, sous Windows, oui c'est bien un contexte OpenGL 1.x qui est en place (malheureusement). Mais sous GNU/Linux on a facilement accès a un contexte 2.x ... et j'ose croire que dans 5 ans nous aurons un contexte 3.x de base )Et puis, si Qt fait des trucs à la mains (O_o) et bah, il y aura grosse perte de performances. Au final, cela voudrait dire, voilà, j'ai une machine OpenGL 1.1 uniquement, je voulais faire des VBO et comme je n'en avais pas, Qt m'a overkiller mon application pour pouvoir le faire ...). Alors que en général, c'est le programmeur qui met des vérifications pour savoir si son programme fonctionnera assez ou pas. Et s'il n'a pas la fonctionnalité, il peut toujours passer par un chemin moins couteux ou une plus vieille technique ... Le dernier problème sur ce genre de truc, c'est que la moitié du temps, on joue avec des pointeurs de fonctions. Deux cas arrivent, soit le programme ne compile pas, car le driver n'a pas les fonctions voulus (cas de l'installation des shaders avec Windows, et on a recourt à GLEW / Qt ou autre). Soit on a une fonction qui nous retourne un pointeur sur la fonction (getProcAddress) et qu'il faut vérifié, sinon crash. Enfin bref, je demandais juste de rajouter une petite phrase du genre, oui la technique du bloc glBegin/glEnd, bien que très pratique pour dessiner nos axes et a évité. Citation:
. Il faut que je vérifie sur mes autres machines
__________________
Vous souhaitez participer à la rubrique 2D / 3D / Jeux ? Contactez-moi ![]() La rubrique a aussi un blog ! Ma page sur DVP Mon Portfolio Qui connaît l'erreur, connaît la solution. |
||
|
10
|
|
|
#9 | ||||
|
Nouveau Membre du Club
![]() Michel Développeur informatique Inscription : juin 2011 Messages : 18 ![]() |
Hi!
Je m'excuse pour ma réponse plutôt tardive, mais étant tout nouveau sur Developpez.com, je m'attendais, un peu naïvement j'en conviens, à recevoir un mail m'annonçant l'arrivée de nouveaux messages sur cette page de discussion. Bref, après avoir rajouté "CONFIG += console debug" dans les .pro et compilé en mode "debug", la console me délivre les messages suivants : concernant l'application "OpenGL-shader" : Code :
Code :
OS : Windows seven 32 bits Qt : version 4.70 Compilation : mingw32 version 3.81 |
||||
|
|
00
|
|
|
#10 | ||
![]() ![]() ![]() ![]() Alexandre LaurentIngénieur développement logiciels Inscription : mai 2008 Messages : 10 372 ![]() |
Citation:
Citation:
__________________
Vous souhaitez participer à la rubrique 2D / 3D / Jeux ? Contactez-moi ![]() La rubrique a aussi un blog ! Ma page sur DVP Mon Portfolio Qui connaît l'erreur, connaît la solution. |
||
|
00
|
|
|
#11 | ||
|
Nouveau Membre du Club
![]() Michel Développeur informatique Inscription : juin 2011 Messages : 18 ![]() |
Hi!
Merci pour votre réactivité (c'est pas comme la mienne!) Citation:
Concernant ma "carte graphique" (dans mon cas "chipset" serait plus approprié), voila les infos que j'ai récupérées à l'adresse : http://www.intel.com/support/siu.htm Citation:
|
||
|
|
00
|
|
|
#12 |
![]() ![]() ![]() ![]() Alexandre LaurentIngénieur développement logiciels Inscription : mai 2008 Messages : 10 372 ![]() |
Intel a toujours été reconnu comme étant une bête noire dans le support d'OpenGL et de tout ce qui est 3D (bon ok, surtout OpenGL).
Ainsi, par exemple, plein de chipset OpenGL, non pas de framebuffer (FBO). Ce qui devient réellement gênant (technique de blur, ou deferred rendering). Après, il peut aussi y avoir que les shaders ne soit pas analyser comme chez NVidia / AMD et que du coup, la compilation foir complêtement. Finalement, d'après les erreurs vu, il se peut aussi que ce soit juste l'auteur qui ne savait pas qu'il faut linker un shader avant d'envoyer certaine information. Enfin, je dis ça, on va surtout voir la réaction du pro, je parle bien de Monsieur gbdivers
__________________
Vous souhaitez participer à la rubrique 2D / 3D / Jeux ? Contactez-moi ![]() La rubrique a aussi un blog ! Ma page sur DVP Mon Portfolio Qui connaît l'erreur, connaît la solution. |
|
00
|
|
|
#13 |
![]() ![]() ![]() Guillaume BelzBiochimiste Inscription : novembre 2008 Messages : 5 312 ![]() |
Non, pas de problème dans le link (sinon, ça poserait problème sur d'autres plateformes aussi).
Le problème est que le fonction texture(sampler2D, vec2) n'est pas trouvé lors de la compilation du vertex shader (les autres erreurs de compilation et de link en découlent). Je dirais que c'est un problème de prise en charge d'OpenGL. Donc achète une carte NVIDIA Sinon, essaie avec la fonction texture2D dans le vertex shader. Remplace Code :
texture_color = texture(texture2d, texture_coordonnees); Code :
texture_color = texture2D(texture2d, texture_coordonnees); Tu peux poster la liste de tes extensions opengl supporté ?
__________________
Vous souhaitez rejoindre l'équipe de bénévoles qui fait vivre Developpez (traduction, rédaction, modération) ? Contactez moi par MP. Ma page personnelle avec la liste de mes articles - Mon blog sur le C++, Qt et les GPU. Je suis régulièrement sur le chat pour les questions C++/Qt. Apprendre Qt 5 : vidéos d'installation (YouTube), extraites du livre Créer des applications avec Qt 5. |
|
00
|
|
|
#14 | ||
|
Nouveau Membre du Club
![]() Michel Développeur informatique Inscription : juin 2011 Messages : 18 ![]() |
Hi!
Encore merci pour votre expertise! Citation:
remplacer Code :
texture_color = texture(texture2d, texture_coordonnees); Code :
texture_color = texture2D(texture2d, texture_coordonnees); Citation:
http://www.realtech-vr.com/glview/download.html j'ai récupéré le .xml attaché à ce message et qui contient, entre autre, la liste des extensions. |
||
|
|
00
|
|
|
#15 |
|
Invité de passage
![]() Ingénieur développement logiciels Inscription : septembre 2011 Messages : 2 ![]() |
Bonjour,
Tout d'abord merci et bravo pour ce tutoriel. Je viens de finir de le parcourir récemment, et j'ai toutefois un comportement que je n'arrive pas à expliquer. Comme des images valent mieux que des mots maladroits, je met en pièce jointe deux illustrations du comportement : Lorsqu'on utilise le FBO pour un rendu offscreen, si l'on réduit la fenêtre, le rendu dans le FBO s'en trouve découper. (ce n'est pas le cas pour les autres mode de rendu offscreen). Si quelqu'un peut m'éclairer sur le pourquoi de ce comportement, je lui en serais reconnaissant. merci d'avance. |
|
|
00
|
|
|
#16 | ||||
![]() ![]() ![]() Guillaume BelzBiochimiste Inscription : novembre 2008 Messages : 5 312 ![]() |
Citation:
Par contre, si tu veux une compatibilité avec du vieux matériel, il est préférable peut être de travailler en vieux OpenGL (sans shaders ?) et d'utiliser le mode compatibilité pour le matériel récent (avec perte de performance) dans un premier temps. Ensuite, tu ajoutes le code nécessaire pour prendre en charge les nouvelles fonctionnalités dans un second temps. Citation:
Citation:
Sur le site de Khronos, tu as les spécifications pour le GLSL pour chaque version. Il faut aller voir dans le pdf correspondant spécifiquement à ta version (ici dans ton cas). Pour le GLSL 1.2, la fonction texture() surchargée n'existe pas, il faut appeler la fonction texture2D() (voir page 64 du pdf) Citation:
Je regarde les sources pour modifier cette fonctionnalité... EDIT : pour le problème de FBO, je ne l'ai pas (Ubuntu 11.04, NVIDIA 8600M GT 512 Mo, driver 285.03, OpenGL 3.3.0). Tu peux donner les caractéristiques de ta carte (et la taille de ta RAM GPU) ? Je pense à un problème de buffer saturé...
__________________
Vous souhaitez rejoindre l'équipe de bénévoles qui fait vivre Developpez (traduction, rédaction, modération) ? Contactez moi par MP. Ma page personnelle avec la liste de mes articles - Mon blog sur le C++, Qt et les GPU. Je suis régulièrement sur le chat pour les questions C++/Qt. Apprendre Qt 5 : vidéos d'installation (YouTube), extraites du livre Créer des applications avec Qt 5. |
||||
|
00
|
|
|
#17 | |||
|
Nouveau Membre du Club
![]() Michel Développeur informatique Inscription : juin 2011 Messages : 18 ![]() |
Hi!
Citation:
Bon, dans les fichiers de shader "vertex.glsl" j'ai remplacé Code :
texture_color = texture(texture2d, texture_coordonnees.st); Code :
texture_color = texture2D(texture2d, texture_coordonnees.st); ![]() L'appli OpenGL-offscreen quant à elle, n'a pas bougé d'un poil, elle avorte après avoir envoyé à la console un fort désobligeant : Code :
|
|||
|
|
00
|
|
|
#18 | |
|
Invité de passage
![]() Ingénieur développement logiciels Inscription : septembre 2011 Messages : 2 ![]() |
Citation:
Driver : Driver Packaging Version 8.881-110728a-124445C-ATI Catalyst Version 11.8 glGetString(GL_VERSION) donne : "3.3.11005 Compatibility Profile Context" Sinon, je suis sous windows7 SP1, avec QtCreator/MinGW. je ne sais pas si ça peut jouer. |
|
|
|
00
|
|
|
#19 |
|
Invité régulier
![]() Inscription : août 2007 Messages : 10 ![]() |
Super tuto. Bravo.
Juste une petite remarque : Dans le paragraphe 4, vous dites: "un exemple de Geometry Shader (uniquement à partir de la version 4.7 de Qt) sera présenté dans le chapitre suivant. " Or, il semble que l'exemple n'arrive finalement pas. Mais cela n'enlève rien au mérite de ce beau tuto. |
|
|
00
|
|
|
#20 | ||
![]() ![]() ![]() Guillaume BelzBiochimiste Inscription : novembre 2008 Messages : 5 312 ![]() |
Citation:
Citation:
__________________
Vous souhaitez rejoindre l'équipe de bénévoles qui fait vivre Developpez (traduction, rédaction, modération) ? Contactez moi par MP. Ma page personnelle avec la liste de mes articles - Mon blog sur le C++, Qt et les GPU. Je suis régulièrement sur le chat pour les questions C++/Qt. Apprendre Qt 5 : vidéos d'installation (YouTube), extraites du livre Créer des applications avec Qt 5. |
||
|
00
|
Copyright © 2000-2013 - www.developpez.com