Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2764 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  [OpenGL] traitements sur le display buffer

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[OpenGL] traitements sur le display buffer

n°1325788
Fa7
Posté le 15-03-2006 à 13:43:47  profilanswer
 

Bonjour,
 
J'ai un petit probleme en OpenGL (enfin plus exactement en OpenSG mais mon probleme viens de l'openGL...)
Dans mon prog, je modifie le Display Buffer (GL_RGB).. Le probleme c'est que lors des déplacements, on voit l'image normale puis l'image modifiée... ce qui fait un scintillement tres désagreéable ;)
 
Le code:

Code :
  1. void display(void) {
  2.   glClear (GL_COLOR_BUFFER_BIT);
  3.   mgr->redraw();   // Commande OpenSG qui raffraichit la scene
  4.   glReadPixels (0, 0, _w, _h, GL_RGB, GL_FLOAT, rgb);
  5.        
  6.   (...)
  7.   // Traitements effectués sur la variable rgb
  8.   (...)
  9.   glDrawPixels(_w, _h, GL_RGB, GL_FLOAT, rgb);
  10.   glutSwapBuffers ();
  11. }


 
L'idéal serait de rendre le displayBuffer mais sans l'afficher .. mais je ne vois pas du tout comment faire ...
 
Une idée ?
 
Meric d'avance !

mood
Publicité
Posté le 15-03-2006 à 13:43:47  profilanswer
 

n°1325816
_darkalt3_
Proctopathe
Posté le 15-03-2006 à 14:14:37  profilanswer
 

y'aurait pas double emploi entre mgr->redraw et glutSwapBuffers ?

n°1326112
Fa7
Posté le 15-03-2006 à 18:53:52  profilanswer
 

Non non, puisque le mgr->redraw sert à afficher la scene, puis je récupère le displayBuffer (le GL_RGB), je le modifie (glDrawPixels) et le glutSwapBuffers sert à réafficher le displaybuffer...
 
sans le premier, mon displayBuffer est vide, sans le deuxieme, les modifications apportées ne sont pas prises en compte...

n°1326178
bjone
Insert booze to continue
Posté le 15-03-2006 à 20:31:03  profilanswer
 

déjà à la base c'est le mal ce que tu essaies de faire, mais bon passons, ensuite tu récupère tes composantes sous forme de flottants... c'est voulu ?

n°1326179
bjone
Insert booze to continue
Posté le 15-03-2006 à 20:33:44  profilanswer
 

par contre si tu vois l'image rendu puis l'image modifiée, c'est probablement que gr->redraw(); fait un glutSwapBuffers()...

n°1326183
Fa7
Posté le 15-03-2006 à 20:36:14  profilanswer
 

bjone a écrit :

déjà à la base c'est le mal ce que tu essaies de faire, mais bon passons, ensuite tu récupère tes composantes sous forme de flottants... c'est voulu ?


 
En fait je veux colorer certains pixels.. Je ne vois pas d'autres méthodes directes...
Ca va pas les GL_FLOAT ? il faut quoi ?

n°1326189
bjone
Insert booze to continue
Posté le 15-03-2006 à 20:45:06  profilanswer
 

bin disons que c'est méga lent !!!
 
à la base Read/Draw c'est pas top (download/upload sur l'AGP, enfin si c'est pour faire un bench pour montrer la supériorité du PCI Express sur l'AGP)
 
le framebuffer a ses composantes en entiers 8bits si tu est en 32bpp, passer par des flottants fait que glRead/DrawPixels doivent faire des conversions entier->flottant, flottant->entier....
 
après ça dépends de ce que tu veux faire (specs minimales de la carte 3D & perfs), mais si ton traitement n'est pas compliqué, une implémentation moderne serait plustôt de faire un rendu en texture et d'utiliser un fragment shader......
(ou de verrouiller le framebuffer et de passer un shader par dessus)
 
après ça dépends si t'as une carte qui peut supporter de l'OpenGl >= 1.4 ~1.5 (voir 2.0 ché pas j'y connais rien en OpenGl)

Message cité 1 fois
Message édité par bjone le 15-03-2006 à 20:47:01
n°1326246
Fa7
Posté le 15-03-2006 à 22:00:06  profilanswer
 

bjone a écrit :

bin disons que c'est méga lent !!!
 
à la base Read/Draw c'est pas top (download/upload sur l'AGP, enfin si c'est pour faire un bench pour montrer la supériorité du PCI Express sur l'AGP)
 
le framebuffer a ses composantes en entiers 8bits si tu est en 32bpp, passer par des flottants fait que glRead/DrawPixels doivent faire des conversions entier->flottant, flottant->entier....
 
après ça dépends de ce que tu veux faire (specs minimales de la carte 3D & perfs), mais si ton traitement n'est pas compliqué, une implémentation moderne serait plustôt de faire un rendu en texture et d'utiliser un fragment shader......
(ou de verrouiller le framebuffer et de passer un shader par dessus)
 
après ça dépends si t'as une carte qui peut supporter de l'OpenGl >= 1.4 ~1.5 (voir 2.0 ché pas j'y connais rien en OpenGl)


 
 
Oui c'est vrai que c'est lent !
Et comme je travaille sur le DepthBuffer aussi, je fasi un autre glReadPixels ! Donc je te raconte pas les perfs !
Mais je ne vois pas du tout d'autres solutions...
Le probleme c'est que mon appli doit tourner apres sur opengl ES (version pda de openGL), et je ne pense pas que les fragmentBuffer existe...

n°1326251
retrox
Posté le 15-03-2006 à 22:08:37  profilanswer
 

Si tu n'as pas de RTT (render-to-texture), passe au moins par l'API texture (CopyTexSubImage).  
ReadPixels/DrawPixels c'est à peu pres ce qui se fait de plus lent en OpenGL.

n°1326256
Fa7
Posté le 15-03-2006 à 22:13:55  profilanswer
 

Ok merci beaucoup ! je vais chercher vers la...

mood
Publicité
Posté le 15-03-2006 à 22:13:55  profilanswer
 

n°1326513
Fa7
Posté le 16-03-2006 à 10:23:54  profilanswer
 

Bon pour le GL_FLOAT, je dois rester avec ca, il me faut des valeurs entre 0 et 1...

n°1326525
bjone
Insert booze to continue
Posté le 16-03-2006 à 10:40:10  profilanswer
 

c'est quoi l'idée de ton traitement ?
ça implique plusieurs pixels ? (matrice de filtre...)
ça peut s'émuler par un lookup dans une texture ?

n°1326528
Fa7
Posté le 16-03-2006 à 10:41:53  profilanswer
 

En fait, je dois colorer les pixels qui sont à une certaine profondeur (qui est lue dans le depth buffer)...
Donc effectivement ca impliqie plusieurs pixels :D
 
C'est quoi le "look up" ?

n°1326728
bjone
Insert booze to continue
Posté le 16-03-2006 à 14:45:31  profilanswer
 

non c'est pas ça que je veux dire... je voulais savoir si pour modifier un pixel(x,y), il te fallait les pixels(x-1,y), (x+1,y), etc.... pour procéder à un filtrage maison.
 
si ta relation de modification est uniquement liée à la profondeur du pixel désiré, alors normalement tu peux faire directement dans le pixel ou le vertex shader (suivant le dégré de précision désiré).
 
car ta relation altération couleur par rapport à sa distance, c'est ce qui est plus ou moins fait pour le brouillard....
 
un texture de lookup, c'est une texture 1D/2D ou+ qui permet d'émuler une fonction mathématique complexe:
 
par exemple pour une exponentiation: nouvelle_valeur=pow(valeur,exposant), tu peux utiliser une texture 2D avec la valeur en X, et l'exposant en Y.... (au lieu de calculer tu vas lire une texture => table de précalcul)
 

n°1326741
Fa7
Posté le 16-03-2006 à 14:52:42  profilanswer
 

je ne pense pas pouvoir utiliser le pixel ou vertex shader..
déja, comme je l'ai dit plus haut, je dois faire tourner ca sur openGL ES, et je ne pense pas que les chipsets embarqués integrent des pixels ou vertex shaders.. (a verifier tout de meme..)
De plus (je me trompe peut etre, je connais tres mal les shaders), dans ce que je dois faire, on sélectionne des zones au clavier (les profondeurs..), et je ne pense pas pouvoir faire ca avec des shaders..
 
Ca m'arrangerait vraiment de pouvoir faire ca qu'avec openGL...
j'ai pensé a une technique...
 
* récupérer le depth buffer par la meme méthode (parce quej'en vois pas d'autre...)  
* créer un buffer ou les pixels à colorer sont en rouge, et afficher ce buffer par dessus l'image...  
Mais je ne vois pas comment faire cette derniere opération...  
je pensais à un plan qui serait affiché devant la camera, avec de la transparence, mais j'ai peur niveau perfs... (quoi que ca ne peut pas etre pire :D)
 

n°1326773
Fa7
Posté le 16-03-2006 à 15:25:21  profilanswer
 

Je viens de voir que OpenGl ES possédait son langage de shaders...
http://www.khronos.org/cgi-bin/fet [...] g_language
 
je vais voir un peu si je peux résoudre mes problemes vaec des shaders (notemment l'interaction.. c'est ca qui me fait peur..)

n°1326818
Fa7
Posté le 16-03-2006 à 16:49:00  profilanswer
 

Je pense que je vais partir vers les shaders.; mais je n'y connais rien du tout !
Déja, est ce qu'il est possible d'utiliser des pixel Shaders avec OpenGL 1.5 ?  
Si oui, avec quel langage (GLSL, Cg, autre..) ?  
 
merci d'avance !

n°1326824
_darkalt3_
Proctopathe
Posté le 16-03-2006 à 16:55:08  profilanswer
 

[:drapal]

n°1326927
bjone
Insert booze to continue
Posté le 16-03-2006 à 19:31:58  profilanswer
 

alors avant de t'orienter définitivement vers les shaders, il y a encore des choses a évaluer....
 
tu dis que tu renseigne la zone de profondeur au clavier...
 
en gros c'est quoi, tu as deux profondeurs pour définir ta zone d'interêt ?
ensuite tu altères les pixels dans cette zone ?
 
parceque si c'est ça c'est plus simple, tu utilises le stencil plus ou moins à la doom3 (enfin de loin hein :D):
 
1) clear stencil+Zbuffer
2) test < et update Z activés  
3) traçage scène
 
4) désactivation update Z (le test reste)
 
5) stencil en mode incrémentation
 
6) traçage d'un quad face à la caméra à Z=fin de zone
 
7) traçage d'un quad face à la caméra à Z=début de zone
 
(ou inversement)
 
=> les pixel dans la zone d'intêret ont le stencil à 1.
 
porqué ? comme le quad n'incrémentera le stencil que si le pixel est plus proche que dans le Z-buffer, et que le stencil est à 0:
 
après 6)
- la partie après la fin de zone (zone Z max) restera à 0
- la partie avant la fin de zone sera à 1
 
après 7)  
- la partie après le début de zone (zone Z min) restera à 1
- la partie avant le début de zone sera à 2
 
ce qui fait que tout ce qui est avant le début de zone est à 2, après la fin de zone à 0, et dans la zone à 1.
 
dans la technique je cherche à conserver le même critère de test Z (pixel traité si inférieur au Zbuffer), pour faire ami-ami avec les techniques de Z-Buffer hiéarchique des cartes 3D modernes que l'on a sur PC.
 
enfin si je dis pas de conneries.
 
maintenant si ce que tu veux faire c'est autre chose qu'altérer des pixels dans une zone Z...
 
la blague étant que là ça marche pour une zone, si tu veux plusieures zones, il faut reboucler sans retraçer la scène en cleanant le stencil (mais il faut altérer des pixels dans la boucle)


Message édité par bjone le 16-03-2006 à 19:34:23
n°1326936
Fa7
Posté le 16-03-2006 à 19:38:38  profilanswer
 

ben ce que je veux faire c'est bien ca ! exactement ca meme !!
je te remercie !!
D'autant plus que depuis j'ai eu des nouvelles contraintes, je ne peux pas utiliser les shaders, ni les glReadPixels et glDrawPixels...
Merci mille fois pour cette technique ! Je ne connaissais pas....

n°1326943
bjone
Insert booze to continue
Posté le 16-03-2006 à 19:43:18  profilanswer
 

à terminer avec un:
 
8) test Z désactivés, test stencil = 1
 
9) traçer un quad avec une couleur unie et un blending à 50/50 pour altérer les pixels dans la zone (par exemple)


Message édité par bjone le 16-03-2006 à 19:53:50
n°1326947
bjone
Insert booze to continue
Posté le 16-03-2006 à 19:45:32  profilanswer
 

en fait la règle si tu veux de la vitesse, c'est de rester le plus possible local à l'accélérateur 3D, quitte a faire des trucs tordus au premier abord.

n°1326953
bjone
Insert booze to continue
Posté le 16-03-2006 à 19:48:44  profilanswer
 

sinon tu peux ptet jouer avec les clip planes si tu les as, mais ça impose 3 traçages de scène:
 
un pour la scène avant le début de zone (clip plane < zone_Z_min), un après la fin de zone (clip plane > zone_Zmax), et la dernière passe avec deux clips planes pour être dans la zone (tu auras deviné)....
 
mais j'ai peur que tu aies des problèmes de clipping (ptet des trucs bizarres aux liaisons)....
 
aussi ptet juste en jouant avec les zmin/zmax de la matrice de projection....
 
---
 
sinon tu peux aussi traçer la scène, mettre deux clipplanes, et la retraçer avec d'autres propriétées de matériaux avec blending... (genre multipasse classique à la quake quand y'a pas de multi texturing)
 
enfin si je dis pas de conneries, j'ai pas non plus trop expérimenté ce genre de conneries :D


Message édité par bjone le 16-03-2006 à 19:58:30
n°1328820
Fa7
Posté le 20-03-2006 à 14:27:07  profilanswer
 

J'ai quelques questions a propos de ton algo:
 
* Comment tu fasi pour désactiver l'update mais pas le test ? je ne vois que la commande glEnable (Gl_DEPTH_TEST)...
* Les quads que je trace effacent ma scene... est ce que c'ets justement du au test de Z ? ou alors je dois faire un glutSwapBuffers juste apres le tracage de la scene ?
* Quand tu parle de test stencil = 1, c'est glStencilMask (1) ?
 
merci d'avance !! et merci encore !
 

n°1328873
bjone
Insert booze to continue
Posté le 20-03-2006 à 15:46:47  profilanswer
 

le glutSwapBuffers c'est pour faire l'échange entre le front et le backbuffer, donc non jamais ça. (hormis a la fin que tu est sûr que tout est fini)
 
oué pour les quads, il faut aussi couper l'écriture de la couleur des pixels en eux-mêmes... (il faut juste tester le quad contre le ZBuffer et actualiser le Stencil en conséquence)

n°1328881
bjone
Insert booze to continue
Posté le 20-03-2006 à 15:52:43  profilanswer
 

alors j'ai regardé dans google les trucs qu'il fallait faire:
 
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
 
ça coupe l'écriture vers le buffer couleur.
 
glDepthMask(GL_FALSE), ça coupe l'écriture dans le Z-Buffer...
 
a toi de les placer au bon endroits....

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  [OpenGL] traitements sur le display buffer

 

Sujets relatifs
Buffer image et MFC[OpenGL] Combiner plusieurs rotations
OpenGLopenGL : Un cercle d'angle > 3*PI ??????
Driver OpenGlbuffer du chargement de MP3
Aurais besoin de tuyaux competant en openGLProblème en C et OpenGL
Vertex Buffer Object en OpenGL 
Plus de sujets relatifs à : [OpenGL] traitements sur le display buffer


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR