OpenGL : combien de lumières on peut utiliser ?

OpenGL : combien de lumières on peut utiliser ? - C++ - Programmation

Marsh Posté le 24-03-2004 à 08:00:43    

Voilà, je suis en train de coder un jeu en OpenGL, et il me semble que le nombre de lumières utilisables est GL_MAX_LIGHTS. Donc j'affiche la valeur de GL_MAX_LIGHTS pendant l'éxécution de mon programme, et je vois un truc genre 2270, sauf que quand je met un certain nombre de lumières, les dernières ne sont pas utilisées, j'ai l'impression que seules les 8 premières fonctionnent. De plus, il est dit dans la doc que le nombre de lumières dépand de l'implémentation (d'où l'utilité de GL_MAX_LIGHTS) et est de 8 au minimum. Moi j'ai l'impression que malgré le fait que la valeur de GL_MAX_LIGHTS soit énorme, je ne peux mettre que 8 lumières :( Si quelqu'un peut m'éclairer (ah ah ah) à ce sujet, svp. Ah oui, et aussi, pour les lumières "de position" (pas directionnelles), l'éclairage sur une face triangulaire est calculé aux 3 extrémités, et ensuite les autres points de la face sont éclairés en faisant des moyennes des valeurs trouvées aux extrémités, donc si on place une lumière assez près de la face, au milieu, l'éclairage sur les extrémités est très faible (angle important avec la normale), et donc la moyenne au milieu est faible aussi, alors que la lumière est juste en face, donc le milieu de la face devrait être très lumineux... je ne sais pas comment changé le mode de calcul, si c'est possible... Merci d'avance si quelqu'un peut m'aider...


---------------
~~ Yawen ~~
Reply

Marsh Posté le 24-03-2004 à 08:00:43   

Reply

Marsh Posté le 24-03-2004 à 08:47:05    

Tu peux avoir plus de lumiere en faisant tout toi meme: plusieurs passes en fonction du nombre de lumières, heureusement pour toi la luminosité est additive (tant que tu n'utilises pas de post filtrage style HDR lighting.).  
 
Pour l'éclairage au centre du triangle, c'est un problème bien connu qui est résolu par l'éclairage par pixel.
Pas de bol l'éclairage par pixel tu dois aussi le faire toi meme avec un fragment program par exemple.
 
A+
LeGreg

Reply

Marsh Posté le 24-03-2004 à 08:56:03    

sinon generalement on évite d'avoir plus de 8 lumières "simultanément".
 
Tu peux en avoir plus de 8 dans ta scene mais tu peux te débarrasser de quelques unes en fonction de leur puissance relative et de leur distance à l'objet à éclairer ou des éléments qui font de l'ombre.
 
LeGreg

Reply

Marsh Posté le 24-03-2004 à 09:16:04    

Yawen a écrit :

Voilà, je suis en train de coder un jeu en OpenGL, et il me semble que le nombre de lumières utilisables est GL_MAX_LIGHTS. Donc j'affiche la valeur de GL_MAX_LIGHTS pendant l'éxécution de mon programme, et je vois un truc genre 2270, sauf que quand je met un certain nombre de lumières, les dernières ne sont pas utilisées, j'ai l'impression que seules les 8 premières fonctionnent. De plus, il est dit dans la doc que le nombre de lumières dépand de l'implémentation (d'où l'utilité de GL_MAX_LIGHTS) et est de 8 au minimum. Moi j'ai l'impression que malgré le fait que la valeur de GL_MAX_LIGHTS soit énorme, je ne peux mettre que 8 lumières :( Si quelqu'un peut m'éclairer (ah ah ah) à ce sujet, svp. Ah oui, et aussi, pour les lumières "de position" (pas directionnelles), l'éclairage sur une face triangulaire est calculé aux 3 extrémités, et ensuite les autres points de la face sont éclairés en faisant des moyennes des valeurs trouvées aux extrémités, donc si on place une lumière assez près de la face, au milieu, l'éclairage sur les extrémités est très faible (angle important avec la normale), et donc la moyenne au milieu est faible aussi, alors que la lumière est juste en face, donc le milieu de la face devrait être très lumineux... je ne sais pas comment changé le mode de calcul, si c'est possible... Merci d'avance si quelqu'un peut m'aider...


 
Déjà, pour GL_MAX_LIGHTS aucune carte ne gère 2270 lights.
Sur ma Geforce2, GL_MAX_LIGHTS est à 8. Il me semble que sur les cartes plus récentes c'est passé à 16, mais c'est vraiment pas sûr...
 
 
 
 
 
 
 
 

Reply

Marsh Posté le 24-03-2004 à 12:40:17    

Le 2270 me semble assez énorme aussi, mais c'est ce que je vois en faisant printf("%d",GL_MAX_LIGHTS), maintenant, j'avoue que je ne sais pas quel est le type de GL_MAX_LIGHTS, et donc si on peut afficher la valeur comme ça...
 
En ce qui concerne l'éclairage par pixel, je vois ce que c'est (avant de me lancer dans OpenGL, j'ai fais quelques programmes pour faire du rendu en ray tracing), mais par contre, je vois pas comment le faire en OpenGL (c'est quoi, un "fragment program" ?).
En trainant un peu sur internet, j'ai lu quelques trucs, en particulier en rapport avec le bump mapping : une des methodes consistait à faire un tableau de normales qu'on applique un peu comme une texture, pour que chaque point de la face soit éclairé avec la normale qui va bien, mais je ne sais pas non plus comment faire ça en OpenGL (dans le fond, ça revient au même problème que l'éclairage par pixel : est ce qu'il existe des fonctions en OpenGL qui permettent de le faire ? parce que si je le fais moi même, c autant dire que l'affichage sera entièrement software...).
 
En ce qui concerne les ombres, je vois bien quelques moyens de les faire, par exemple en "projetant" toutes les faces sur la face qu'on est en train de dessiner, selon la position de la lumière, et de ne dessiner la face que là où les projections des autres faces ne sont pas (par exemple en utilisant le stencil buffer), puis de procéder de même pour les autres lumières, et enfin de tout refaire pour chaque face... mais ça necessite beaucoup de passes par face (autant qu'il y a de lumières) et beaucoups de calculs pour chaque faces... je suppose que ce n'est pas du tout la meilleure méthode... de toute façon, mon jeu se passe dans l'espace, donc je pense que je vais laisser tomber les ombres portées, ça ne se voit pas trop...


---------------
~~ Yawen ~~
Reply

Marsh Posté le 24-03-2004 à 13:09:36    

Yawen a écrit :

Le 2270 me semble assez énorme aussi, mais c'est ce que je vois en faisant printf("%d",GL_MAX_LIGHTS), maintenant, j'avoue que je ne sais pas quel est le type de GL_MAX_LIGHTS, et donc si on peut afficher la valeur comme ça...


 
Aie, c'est pas ça du tout  :D .
La, tu récupères une valeur de constante.
 
Faut faire :

Code :
  1. GLint gl_max;   
  2.     glGetIntegerv(GL_MAX_LIGHTS, &gl_max);
  3.    
  4.     printf( "GL_MAX_LIGHTS = %d\n", (int)gl_max );


Message édité par pascal_ le 24-03-2004 à 13:09:50
Reply

Marsh Posté le 24-03-2004 à 13:15:03    

ah, ok, merci... mais de toute façon je n'ai plus vraiment besoin de connaitre la valeur puisque je sais que c 8 ou au mieux 16, et que de toute façon j'irais pas très loin avec ça... (ceci dit, j'ai pas trop compris le truc, là, c quoi, exactement, GL_MAX_LIGHTS ?)


---------------
~~ Yawen ~~
Reply

Marsh Posté le 24-03-2004 à 13:17:07    

Yawen a écrit :

 
En ce qui concerne les ombres, je vois bien quelques moyens de les faire, par exemple en "projetant" toutes les faces sur la face qu'on est en train de dessiner, selon la position de la lumière, et de ne dessiner la face que là où les projections des autres faces ne sont pas (par exemple en utilisant le stencil buffer), puis de procéder de même pour les autres lumières, et enfin de tout refaire pour chaque face... mais ça necessite beaucoup de passes par face (autant qu'il y a de lumières) et beaucoups de calculs pour chaque faces... je suppose que ce n'est pas du tout la meilleure méthode... de toute façon, mon jeu se passe dans l'espace, donc je pense que je vais laisser tomber les ombres portées, ça ne se voit pas trop...


 
Effectivement, c'est la première solution qui vient tout de suite à l'esprit. Mais faut vite l'oublier si tu veux faire du temps réel.
 
Va voir sur ce site http://tfpsly.planet-d.net/francais/index.html sous la rubrique "3D doc". Il y a quelques explications simples (et c'est en français).
 

Reply

Marsh Posté le 24-03-2004 à 13:19:08    

Yawen a écrit :

ah, ok, merci... mais de toute façon je n'ai plus vraiment besoin de connaitre la valeur puisque je sais que c 8 ou au mieux 16, et que de toute façon j'irais pas très loin avec ça... (ceci dit, j'ai pas trop compris le truc, là, c quoi, exactement, GL_MAX_LIGHTS ?)


 
Du gl.h :

Code :
  1. #define GL_MAX_LIGHTS                           0x0D31


 
En décimale, 0x0D31 ça fait 3377.

Reply

Marsh Posté le 24-03-2004 à 13:28:38    

erf, ouais, maintenant que tu me le dis, ça dois effectivement être la valeur que je lisais (j'ai pas relancé le programme depuis, je suis en période de partiels... dur de programmer quand on est étudiant...). Merci pour tout, j'irais voir le site quand j'aurais finis les partiels...


---------------
~~ Yawen ~~
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed