PLAN D'EAU [OPENGL] [VISUAL C++]

zeratul67 Messages postés 97 Date d'inscription mardi 9 avril 2002 Statut Membre Dernière intervention 11 mai 2008 - 25 août 2005 à 21:29
Cphil51 Messages postés 87 Date d'inscription jeudi 22 juin 2006 Statut Membre Dernière intervention 24 septembre 2007 - 24 sept. 2006 à 16:06
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/33451-plan-d-eau-opengl-visual-c

Cphil51 Messages postés 87 Date d'inscription jeudi 22 juin 2006 Statut Membre Dernière intervention 24 septembre 2007
24 sept. 2006 à 16:06
ymerej -> Essaie de faire des cast.
cs_ymerej Messages postés 165 Date d'inscription vendredi 9 avril 2004 Statut Membre Dernière intervention 5 octobre 2007
11 mai 2006 à 20:20
Y'aurait-il moyen que tu mettes l'executable car quand on télécharge le ZIP, il n'y est pas.
Faut que tu le renommes en .exe.cutable par exemple ;-)
N'arrivant pas à le compiler sous Visual C++ (.NET 2005), j'aimerais bien voir ce que ca donne.

Pour infos, voici mes erreurs de compilation :

Compiling...
Camera.cpp
camera.cpp(46) : error C2666: 'fmod' : 3 overloads have similar conversions
math.h(561): could be 'long double fmod(long double,long double)'
math.h(513): or 'float fmod(float,float)'
math.h(120): or 'double fmod(double,double)'
while trying to match the argument list '(float, double)'
camera.cpp(47) : error C2666: 'fmod' : 3 overloads have similar conversions
math.h(561): could be 'long double fmod(long double,long double)'
math.h(513): or 'float fmod(float,float)'
math.h(120): or 'double fmod(double,double)'
while trying to match the argument list '(float, double)'
Effet.cpp
main.cpp
ecriture.h(30) : error C2664: 'CreateFontW' : cannot convert parameter 14 from 'LPSTR' to 'LPCWSTR'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
ecriture.h(81) : warning C4267: 'argument' : conversion from 'size_t' to 'GLsizei', possible loss of data
main.cpp(60) : error C2664: 'auxDIBImageLoadW' : cannot convert parameter 1 from 'char []' to 'LPCWSTR'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
main.cpp(452) : error C2440: '=' : cannot convert from 'const char [7]' to 'LPCWSTR'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
main.cpp(479) : error C2664: 'CreateWindowExW' : cannot convert parameter 2 from 'const char [7]' to 'LPCWSTR'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
Plan_deau.cpp
Vecteur.cpp
Generating Code...
cs_remi1203 Messages postés 42 Date d'inscription jeudi 20 février 2003 Statut Membre Dernière intervention 5 novembre 2005
5 nov. 2005 à 12:23
ewik > Pour les shaders oui y faut une carte récente mais pas autant. Moi j'ai une GeForce 4 (Ti 4800) et les shaders marchent très bien. Ce qui ne marche pas c'est le Cg.
cs_ewik Messages postés 6 Date d'inscription jeudi 6 novembre 2003 Statut Membre Dernière intervention 6 septembre 2005
6 sept. 2005 à 10:03
blotfib >> GLUT (OpenGL Utility Toolkit) est une (vieille) librairie gérant le fenêtrage, le contexte d'affichage, le clavier, la souris... Les avantages sont la portabilité et la grande simplicité d'utilisation. En gros pour faire une fenêtre sous windows faut un gros paté tout moche d'une centaine de ligne de code, avec glut faut juste 3 lignes. Tu peux le télécharger sur le site http://www.opengl.org ou sur http://www.xmission.com/~nate/glut.html
Il existe d'autres librairies gratuites comme freeglut qui sont des mises à jour de glut, cependant la plupart des gens se contentent de glut qui fonctionne très bien.
zeratul67 Messages postés 97 Date d'inscription mardi 9 avril 2002 Statut Membre Dernière intervention 11 mai 2008
5 sept. 2005 à 19:48
sauf erreur de ma part, glut est un header opengl, tout simplement :)
blotfib Messages postés 2 Date d'inscription lundi 5 septembre 2005 Statut Membre Dernière intervention 5 septembre 2005
5 sept. 2005 à 11:44
salut

je voulais compiler ça sur du VC++6 mais il me manque le glut.h
j'ai besoin de quoi pour que ça marche ? (et où ?
merci

PS
si j'ai bien compris, cela veut ddire que c'est une win32 appli et pas une fenetre et que c'est glut qui gere les fenetres et le clavier ???
cs_ewik Messages postés 6 Date d'inscription jeudi 6 novembre 2003 Statut Membre Dernière intervention 6 septembre 2005
30 août 2005 à 10:41
si, avec les cartes ati tu peux faire des shaders, cependant, l'extension dont tu parlait (GL_NV_vertex_program) est une extension nvidia (NV pour nvidia), donc ta carte ne la supporte pas. Et après il te faut une carte récente, disons 1 (peut être 2) an(s) d'age max. Côté nvidia il faut minimum une geforce fx, je crois, et côté ati j'en sais trop rien, une radeon 9800 pro ca marche, plus vieux j'en doute.
cs_mat74 Messages postés 241 Date d'inscription dimanche 10 août 2003 Statut Membre Dernière intervention 16 juin 2010
29 août 2005 à 17:10
j'ai remis à jours les drivers il y a un programme qui passe mais le reste marche tjs pas .
mais j'ai une ati 4200 sa doit être pour sa .

donc en gros je peux pas faire de shader avec une ati ?
cs_ewik Messages postés 6 Date d'inscription jeudi 6 novembre 2003 Statut Membre Dernière intervention 6 septembre 2005
29 août 2005 à 10:07
mat74 >> Soit ca veut dire que ta carte graphique est trop vieille et qu'elle ne supporte pas les shaders, soit c'est que tu as une ati, et donc normal qu'elle ne supporte pas cette extension (c'est rare quand nvidia ou ati supportent une extension de l'autre). Les extensions indépendantes du vendeur pour faire des shaders sont (de mémoire) :
- GL_ARB_vertex_program (vertex shaders en assembleur)
- GL_ARB_fragment_program (fragment shaders en assembleur)
- GL_ARB_shader_objects (GLSL)
- GL_ARB_vertex_shader (GLSL)
- GL_ARB_fragment_shader (GLSL)
- GL_ARB_shading_language_100 (GLSL)
Pour savoir si ta carte les supporte, soit tu télécharge un logiciel gratuit comme glView (http://www.realtech-vr.com/glview/), soit tu te fais un ptit prog de 3 lignes pour lister les extensions que tu as via glGetString(GL_EXTENSIONS). Ou si tu est sous linux tu tapes glxinfo. Ou sinon encore, sur les sites de nvidia et d'ati il y a des docs indiquant les extensions supportées par leurs cartes graphiques.
Et bien sur, mets bien à jour tes drivers de carte graphique.
cs_mat74 Messages postés 241 Date d'inscription dimanche 10 août 2003 Statut Membre Dernière intervention 16 juin 2010
27 août 2005 à 16:25
ewik : j'ai regardé tes liens. j'ai trouver pamal de truc et j'ai téléchargé qq programme. mais j'arrive pas à faire marcher se que j'ai téléchargé. il me met "GL_NV_vertex_program not supported". ne serai-ce pas ma carte qui ne supporte pas les shader ?
pourtant je l'ai acheter il y a 2-3 ans seulement

Zazour :
- pour ce qui est de la flêche j'avais même pas penser que sa serait un peu chiant si jamais on tournait la camera parce que moi pour mes teste je ne m'en servais pas
- sinon pour l'explication
en fait je fixe un point au lancement de l'effet, le centre. puis ensuite je scan le tableau d'angle. si un point est à une certaine longeur du centre (sur le plan XZ) je met l'angle à PI ( et attenuation à 1 ). sinon j'augmente l'angle et je descend la valeur d'attenuation que je multiplierai par le sinus de l'angle avant l'affichage pour qu'il ni est pas qu'une seule vague mais plusieurs éco. il suffit ensuite d'augmenter la distance recherché entre le centre et le point en court pour que l'on est l'impression que la vague se propage.
voila j'espère avoir été clair, en tout cas j'aurais essayer.
Zazour Messages postés 120 Date d'inscription mercredi 7 mai 2003 Statut Membre Dernière intervention 14 janvier 2006
27 août 2005 à 08:58
si cela peut te rassurer,cela tourne a 50 fps chez moi.
sinon,le reste est bien (ondulations),mais peux tu l'expliquer car je suis pas fort en math,et a tu prévu de rajouter les reflexions des ondulations contre les cotés de la boite?
lorsque l'on bouge la caméra,les axes de la flèche ne suivent pas la caméra,mais reste inchangé (pas trés pratique).
zeratul67 Messages postés 97 Date d'inscription mardi 9 avril 2002 Statut Membre Dernière intervention 11 mai 2008
26 août 2005 à 20:28
Biensûr qu'ils sont indépendant, mais il y a deux façons de faire :
- recalculer les vertex avec le CPU à chaque rendu, et donc on a un rempissage de evrtex buffer à chaque fois
- mettre en place le vertex buffer une seule fois (par exemple vertex pour une eau plane) et utiliserl essaders pour l'annimation, donc plus aucune modif du vertex buffer, moins de transferts
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 2
26 août 2005 à 14:49
Ouah ! Très joli screenshot ! J'ai toujours pas regarder le code mais déjà là gros bravo !

YOYO, @+.
cs_ewik Messages postés 6 Date d'inscription jeudi 6 novembre 2003 Statut Membre Dernière intervention 6 septembre 2005
26 août 2005 à 13:56
zeratul67 >> C'est donc bien l'utilisation du vertex buffer qui permet de ne charger qu'une fois les données. Mais le fait d'utiliser les vertex shaders n'a strictement rien à voir avec cela. Les shaders sont juste des programmes où l'on redéfini nous même les traitements sur les données (vertex ou fragment). Ils n'influent en aucun cas sur la gestion des données en mémoire de la carte graphique. Par contre, le fait d'utiliser les shaders permet dans certains cas d'accélérer le rendu parce que les opérations sont plus simples qu'avec des techniques de rendu en plusieurs passes, nécessaires quand on n'a pas les shaders, par exemple. Et aussi c'est fait au niveau du GPU, où les opérations sont dédiées pour ca, donc c'est plus rapide.
Les programmes sur les vertex shaders reçoivent en entrée des sommets (i.e: coordonnées dans l'espace, coordonnées de texture, normale, couleur...) et les traitent. On ne fait rien d'autre. Au niveau du pipeline on a (très simplifié) :

APPLICATION -- vertex data --> VERTEX PROGRAM -- valeurs interpolées --> FRAGMENT PROGRAM -- fragments --> FRAMEBUFFER

La gestion mémoire se trouve avant le vertex program. C'est au niveau de l'application quand on construit le VBO qu'on détermine que nos données sont dans la mémoire de la carte graphique. On peut très bien utiliser les shaders sans VBO, et donc à chaque frame rebalancer toutes les données de la mémoire centrale vers la carte graphique.

Pour résumer : vertex shaders et vertex buffer ne sont pas liés et sont totalement indépendant.
zeratul67 Messages postés 97 Date d'inscription mardi 9 avril 2002 Statut Membre Dernière intervention 11 mai 2008
26 août 2005 à 13:26
Faux ? pourquoi ? Lorsqu'on fait une annimation en utilisant les vertex saders, le vertex buffer n'est cahrgé qu'une fois dans la mémoire de la carte graphique, et les vertex shaders le traitent pour chaque rendu, ce qui accélère le processus, non ?

COncernantl e fonctionnement des GPU, un article plutôt court, simple et généraliste : http://www.presence-pc.com/actualite/fonctionnement-gpu-10384/
cs_ewik Messages postés 6 Date d'inscription jeudi 6 novembre 2003 Statut Membre Dernière intervention 6 septembre 2005
26 août 2005 à 10:24
zeratul67 >> Faux ! Les vertex shaders permettent simplement de spécifier quelles opérations effectuer sur chaque vertex plutôt que d'utiliser les fonctionnalités fixes. Ce qui permet de faire plein de choses sympas. Et les fragment shaders, pareil, mais au niveau des fragments. Pour ce qui est d'éviter les transferts de données, il faut utiliser les VBOs (Vertex Buffer Object, c'est du GL, sous DX je ne connais pas le nom, mais en gros c'est pareil).

mat74 >> Si tu veux des infos sur les shaders, va sur opengl.org, et télécharge les specs de GLSL (OpenGL Shading Language). Sinon si tu cherches des tutoriaux, jettes un oeil sur gpgpu.com, developer.nvidia.com, developer.3dlabs.com, 3dshaders.com et bien sur google. Il y a des tonnes d'exemples de code sur le net. Mais si tu veux vraiment comprendre comment ca marche regarde le pipeline de la carte graphique, ca donne une bonne idée de ce qui est fait et ou se trouvent ces fameux shaders (et c'est même indispensable de le connaître pour faire de la 3D). Il y a des .ppt sur developer.3dlabs.com qui expliquent ca, je crois.
Bon courage.
cs_mat74 Messages postés 241 Date d'inscription dimanche 10 août 2003 Statut Membre Dernière intervention 16 juin 2010
25 août 2005 à 23:15
le problème c'est que je ne sais pas du tout ce que c'est. j'en es déjà entendu parler mais j'ai pas trouver d'explication clair sur ce que c'était
zeratul67 Messages postés 97 Date d'inscription mardi 9 avril 2002 Statut Membre Dernière intervention 11 mai 2008
25 août 2005 à 21:29
Je t'avoue que je ne connais quasiement pas OpenGL, j'ai juste fais un peu de DirectX. Vu le screenshot, je ne peux que dire une chose : la solution qui me semble être la plus rapide et la plus efficace est basée sur les vertex shaders. (car ils évitent les transferts de vertex vers la carte graphique à chaque rendu

Mais c'est déjà pas mal ce que t'as fait ! :)
Rejoignez-nous