Accueil > Forum > > > > Lightmaps OpenGL
Lightmaps OpenGL
vendredi 15 décembre 2006 à 23:12:36 |
Lightmaps OpenGL

manolobis
|
Bonjour,
Après avoir épuisé les ressources de la gestion des lumières sous openGL (Windows / Dev++) qui sont trop limitées pour mon application je me suis lancé dans les LightMaps.
Pour faire simple j'ai pris l'exemple du site 3ddrome qui m'a semblé simple et explicite et facile à mettre en oeuvre:
- Une structure pour les polygones
- Un générateur de LightMap qui renvoie un 'Unsigned Int' qui est en fait un pointeur sur une texture des composantes d'éclairage de mon polygone.
- Un Multitexturage qui permet de combiner une Texture normal et ma Texture d'éclairage.
Pas de pb jusque là, l'exemple fonctionne parfaitement sauf que l'exemple utilise des rectangles 'Quads' et que sous certains angles d'éclairage mon carré se divise en deux triangles qui ne sont pas éclairés de la même façon (ou plutôt on voit la diagonale qui divise le carré en deux triangles et qui est en fait plus sombre).
J'ai adapté le programmme pour fonctionner avec des traingles (car dans mon appli je n'utilise que des triangles) et là c'est encore pire. Quand la lumière est de face, pas de pb, quand la lumière arrive un peu sur les côtés, même pb les deux triangles de mon carré (qui sont dans le même plan, donc ont un vecteur 'normal' iddentique) ne sont plus éclairés de la même intensité (on voit la diagonale). J'ai testé avec plusieurs sources lumineuses, c'est encore pire. Si une lumière rouge est à gauche, une lumière verte est à droite, mon triangle de gauche est plus rouge et celui de droite plus vert.
Y-a-t'il moyen de résoudre ce problème de façon à ce que la lumière soit homogère quelque soit l'angle de la source et quelque soit le nombre de sources lumineuses?
Si quelqu'un à une suggestion, car je doit dire que tel quel c'est pas très pro et pas très exploitable pour ce que je désire en faire...
D'avance merci.
|
|
samedi 16 décembre 2006 à 12:16:56 |
Re : Lightmaps OpenGL

luhtor
|
Tu calcules surement tes normales pour chaque face et c'est cette
normale que tu mets pour chaque vertex de ton triangle. Pour chaque
vertex, essai de faire la moyenne des normales des faces voisines.
Ou sinon, c'est quoi le filtrage que tu as mis pour la texture lightmap ?
|
|
samedi 16 décembre 2006 à 20:58:51 |
Re : Lightmaps OpenGL

manolobis
|
En fait, Luhtor, je n'ai fait que recopier la démo: - DynamicLightMap de chez 3ddrome. Elle utilise les 'QUADS' et sans rien ajouter de plus, j'avais déjà ce problème lorsque la lumière n'est pas de face on voit la diagonale qui sépare le QUADS en 2 triangles et qui est plus sombre. Puis j'ai adapté la démo aux 'TRIANGLES' et le pb est le même et même pire puisque les bords aussi étaient plus sombres. Pour résoudre les pb de bordures j'ai ensuite rajouté le filtrage: - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T GL_CLAMP_TO_EDGE); au moment de l'affichage après le glBindTexture(...), ce qui à résolu le pb de bord mais pas des triangles d'intensité lumineuse différentes pour les triangles dans un même plan. Le pb étant déjà apparu dans la démo copiée telle quelle je pense que le pb est ailleurs, mais où ? Je n'ose pas croire qu'on puisse pas avoir un meilleur résultat avec les lighmaps car j'ai vu des démos parfaites qui utilisait cette technique.
A+
|
|
samedi 16 décembre 2006 à 22:09:38 |
Re : Lightmaps OpenGL

luhtor
|
Mais il faut que tu précises au moins filtrage linéaire à opengl pour
la lightmap sinon ca ne m'étonne pas qu'on trouve des trucs un peu
bizzare.
Ou alors, ya un pb dans le calcul des normales et de la luminosité.
|
|
samedi 16 décembre 2006 à 22:15:32 |
Re : Lightmaps OpenGL

luhtor
|
Mais il faut que tu précises au moins filtrage linéaire à opengl pour
la lightmap sinon ca ne m'étonne pas qu'on trouve des trucs un peu
bizzare.
Ou alors, ya un pb dans le calcul des normales et de la luminosité.
|
|
samedi 16 décembre 2006 à 23:56:45 |
Re : Lightmaps OpenGL

manolobis
|
Le filtrage linéaire se trouve dans le calcul de la lightmap dont voici le code qui génère une texture de luminosité à partir d'une surface 'QUADS' et une source lumineuse: static unsigned int generate_lightmap(struct surface *surf) { static unsigned char data[LIGHTMAP_SIZE * LIGHTMAP_SIZE * 3]; static unsigned int lightmap_tex_num = 0; unsigned int i, j; float pos[3]; float step, s, t;
if(lightmap_tex_num == 0) glGenTextures(1, &lightmap_tex_num); step = 1.0f / (float)LIGHTMAP_SIZE; s = t = 0.0f; for(i = 0; i < LIGHTMAP_SIZE; i++) {
for(j = 0; j < LIGHTMAP_SIZE; j++) { float d; float tmp; pos[0] = surf->s_dist * s; pos[1] = surf->t_dist * t; pos[2] = 0.0f; multiply_vector_by_matrix(surf->matrix, pos); pos[0] += surf->vertices[0][0]; pos[1] += surf->vertices[0][1]; pos[2] += surf->vertices[0][2];
pos[0] -= light_pos[0]; pos[1] -= light_pos[1]; pos[2] -= light_pos[2]; d = dot_product(pos, pos) * 0.5f; if(d < 1.0f) d = 1.0f; tmp = 1.0f / d; data[i * LIGHTMAP_SIZE * 3 + j * 3 + 0] = (unsigned char)(255.0f * tmp * light_color[0]); data[i * LIGHTMAP_SIZE * 3 + j * 3 + 1] = (unsigned char)(255.0f * tmp * light_color[1]); data[i * LIGHTMAP_SIZE * 3 + j * 3 + 2] = (unsigned char)(255.0f * tmp * light_color[2]); s += step; } t += step; s = 0.0f; } glBindTexture(GL_TEXTURE_2D, lightmap_tex_num); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); glTexImage2D(GL_TEXTURE_2D, 0, 3, LIGHTMAP_SIZE, LIGHTMAP_SIZE, 0, GL_RGB, GL_UNSIGNED_BYTE, data); return lightmap_tex_num; }
Maintenant faut-il répéter les filtrages GL_LINEAR lors de l'affichage, ce qui n'est pas précisé dans la démo ? La démo affiche ainsi:
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity();
glTranslatef(0.0f, 0.0f, -5.0f); glRotatef(cam_rot[0], 1.0f, 0.0f, 0.0f); glRotatef(cam_rot[1], 0.0f, 1.0f, 0.0f); glRotatef(cam_rot[2], 0.0f, 0.0f, 1.0f); glActiveTextureARB(GL_TEXTURE0_ARB); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, surface_tex_num); glActiveTextureARB(GL_TEXTURE1_ARB); if(lighting) glEnable(GL_TEXTURE_2D); for(i = 0; i < 6; i++) { if(!surfaces[i]) break; if(lighting) glBindTexture(GL_TEXTURE_2D, generate_lightmap(surfaces[i])); glBegin(GL_QUADS);
glMultiTexCoord2fARB(GL_TEXTURE0_ARB, 0.0f, 0.0f); glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 0.0f, 0.0f); glVertex3fv(surfaces[i]->vertices[0]); glMultiTexCoord2fARB(GL_TEXTURE0_ARB, 0.0f, 1.0f); glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 0.0f, 1.0f); glVertex3fv(surfaces[i]->vertices[1]); glMultiTexCoord2fARB(GL_TEXTURE0_ARB, 1.0f, 1.0f); glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 1.0f, 1.0f); glVertex3fv(surfaces[i]->vertices[2]); glMultiTexCoord2fARB(GL_TEXTURE0_ARB, 1.0f, 0.0f); glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 1.0f, 0.0f); glVertex3fv(surfaces[i]->vertices[3]); glEnd(); }
|
|
dimanche 17 décembre 2006 à 12:22:06 |
Re : Lightmaps OpenGL

luhtor
|
Tes sur que c'est correct ta fonction de calcul de lightmap, car ya des trucs vraiment étrange. pos[0] += surf->vertices[0][0]; <= Ca dépend pas de "i" ni de "j" ? pos[1] += surf->vertices[0][1]; pos[2] += surf->vertices[0][2];
d = dot_product(pos, pos) * 0.5f; <= T'es sur de ton calcul la ? La normale rentre jamais en compte ?
A mon avis, c'est la fontion de calcul de Lightmap, qui ne marche pas.
|
|
dimanche 17 décembre 2006 à 16:36:10 |
Re : Lightmaps OpenGL

manolobis
|
L'exemple que j'ai donné n'est qu'un copié-collé de la démo qu'est donné sur le tut de 3ddrome, jette un oeil sur le site: [ Lien ]c'est exactement ça, or ça marche (à peu près) avec des QUADS, bien que sous certains angle de lumière on voit une diagonale plus sombre sur le quads. Effectivement on pourrai croire que 'i' et 'j' n'interviennent pas (directement) mais ils interviennent dans l'initialisation de: pos[0] = surf->s_dist * s; pos[1] = surf->t_dist * t; pos[2] = 0.0f;
par l'intermédiaire de 's' et 't' qui sont incrémenté à chaque boucle. Pour ce qui est des normals effectivement je ne vois pas où qu'ils interviennent.
En tous cas ça ne marche pas tip-top même si dans l'ensemble ça fonctionne.
Maintenant si t'a un site (tuto avec démo) à me conseiller, je suis preneur car je n'arrête pas de me promener sur la toile sans rien trouver d'efficace...
Cette démo me convenait bien (si elle fonctionnait à 100%) car à partir d'un polygone et d'une source lumineuse elle 'fabrique' une texture et renvoie un handle (c'est le principe des lightmap je pense), c'est exactement ce qu'il me faut pour mon application. Donc si tu as une adresse avec un 'truc' équivalent je suis preneur...
D'avance merci, a+
|
|
dimanche 17 décembre 2006 à 21:20:36 |
Re : Lightmaps OpenGL

luhtor
|
Ah oui, mais on parlait pas tout a fait de la meme chose, pour moi une
lightmap, c'est un truc qu'on applique sur un terrain. Et du coup, je
comprend pk les normales n'interviennent pas. Mais par contre, comment
détecter les faces qui sont de dos a la lumière sans normale... le
tutoriel est basique kan meme.
Mais t'as ptet pas besoin de tutoriel pour ca. Maintenant que tu as vu
le principe, tu peux faire toi meme ta fonction de calcul.
Mais dans tous les cas, tu dois avoir exactement le meme résultat avec
des quads ou avec des triangles. Si c'est pas le cas, c'est que tu t'es
planté dans ta décomposition.
|
|
dimanche 17 décembre 2006 à 23:00:31 |
Re : Lightmaps OpenGL

manolobis
|
En fait ce que j'essaie de faire c'est une texture qui représente l'éclairage de ma face et que je combine avec ma texture normale grâce au multitexturing de façon à éclairer mon objet en fonction de la position de la lumière tout cela en évitant le système d'éclairage d'OpenGL. Je pensais, d'après les tutos que j'ai vu, qu'on appelait ça le LightMapping d'où le terme de LightMap.
Bon, mon pb n'est pas résolu, mais comme tu dis j'ai suffisamment bien compris le principe pour que je garde espoir d'en revoir le principe de calcul ou trouver un autre tuto plus fouillé.
Il est vrai que ce tuto avait l'avantage d'être simple, mais ce ne sont pas toujours les solutions les plus simples qui sont les plus efficaces...
Tchao et merci quand même pour tes réponses...
|
|
Cette discussion est classée dans : opengl, exemple, lumière, triangles, lightmaps
Répondre à ce message
Sujets en rapport avec ce message
OpenGL [ par LordBob ]
salut a tous, bah voila y a un truc que je comprend pas, mais j'espere que quelqu'un pourrait m'explquer. Voila lorsque l'on programme avec OpenGL / G
[OpenGL] manque de lumière [ par asmanur ]
Bonjour,En ce moment je travaille sur un prog de shoot à la 1e personne et lorsque des persos tire(Bot ou humain) une lumière s'allume et le prob :Ope
triangles et OPENGL [ par kapotman ]
Bonjour a tousje cherche un source en c ou C++ pour visualiser un triangle dans une fenetre avec translation , rotation et changement d'echelle sans u
Lumière OpenGL [ par PiX3L ]
Salut,j'ai un problème avec les lumières d'openGL. Je m'explique : je réalise un fps en 3D. Mes murs sont des simples polygones auquels j'ajoute une t
prog d'exemple openGL + SDL [ par Arnaud16022 ]
Hi!je cherche une source qui montre comment créer une fenetre, détecter les touches du clavier et les mouvements de la souris ... avec la SDL, ET d'af
Lois de diffusion de la lumière [ par gilimcce ]
Les lois proposées par OpenGl ne sont pas satisfaisantes dans le cas de mon études :Quelqu'un aurait-il une idée pour soit :coder la loi en question (
openGl glutdisplyfunc [ par ropars ]
Je debute en openGL(sous DEV-C++). Tous les tutoriaux que je consulte donnent en premier exemple l'affichage d'un polygone dont les sommets sont defin
gestion de la lumière [ par widwid ]
bonjourje dois représenter une surface avec opengl ,j'ai déjà réussi à fabriquer les triangles qui forment la surface mais le rendu est très mauvais (
Performance opengl minable [ par luhtor ]
Bon je me décide a poster ne trouvant pas de réponse à un de mes pbs. J'ai voulu tester les performances d'opengl, c'est à dire notamment le nombre de
Prolème pour afficher un carré en openGL [ par vincemail ]
Bonjour à tous, je me suis mis à OpenGL depuis peu, et je suis maintenant confronté à un gros problème... voilà, je désire affiché à l'écran un carré
Livres en rapport
|
Derniers Blogs
POUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDNPOUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDN par neodante
Quelle est le point commun entre : Microsoft il y a 10 ans et Apple aujourd'hui ? Réponse: avoir une politique de protocoles propriétaires et fermés :) Car pour rappel (si si je vous assure c'est important de le rappeler), la majorité des spécifications e...
Cliquez pour lire la suite de l'article par neodante JOYEUX ANNIVERSAIRE NIXJOYEUX ANNIVERSAIRE NIX par ebartsoft
Souhaitons un bon et joyeux anniversaire à notre hôte à tous, Nix.
Je ne le répéterais jamais assez mais sans lui rien ne serait possible. Il défit en permanence les lois de la gravité et comme il le dit si bien, si tu lui fais confiance ça devra...
Cliquez pour lire la suite de l'article par ebartsoft IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc
Forum
MATLAB PROGRAMME MATLAB PROGRAMME par wahab1087
Cliquez pour lire la suite par wahab1087 RGB2GRAYRGB2GRAY par musa18
Cliquez pour lire la suite par musa18
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|