Alors que je lisais Redbook, je suis resté assez confus, que OpenGL peut avoir au maximum 8 lumières dans la scène (nombre en fonction de la mise en œuvre, mais devrait être arrondi 8). p>
Mais je peux imaginer nombre de situations qui auraient besoin de plus de lumières, alors je pense qu'il y a une astuce autour de cela dans le jeu Dev. p>
Par exemple, vous avez une très longue rue avec 50 stracktlights, ou vous pouvez avoir une escouade de 20 personnes à l'aide de lampes de poche. Comment vous simulez réellement ces situations? Il y a un problème, que la lumière n'ilumine que la partie de maillage, pas de cône entier entre la source et l'objet, donc si nous n'avons pas d'air pur à 100%, il doit y avoir une sorte de simulation également. Quelle est la façon dont cela se passe et que le jeu est lisse? (Je lis aussi que l'activation des 8 lumières pourrait tuer FPS) P>
3 Réponses :
L'un des astuces qui seront utilisés dans les jeux consiste à simuler la lumière avec une texture. P>
Donc, dans votre exemple de rue, les zones "allumées" seront réellement une image de texture plus lumineuse. Seules les lumières les plus proches seront des sources lumineuses pour obtenir les effets corrects. P>
Il existe des approches similaires où des textures ou des textures semi-transparentes avec un cône transparent sont superposées à la scène pour donner le même effet. P>
N'oubliez pas que pour calculer les ombres, etc. En temps réel signifie que la scène doit être rendue du point de vue de la lumière pour calculer l'intensité de la lumière à n'importe quel endroit. Donc, pour 8 lumières, vous rendant la scène (ou des parties de la scène) jusqu'à 8 fois avant em> rendant réellement la scène à l'affichage. Même si cela est fait sur le GPU plutôt que sur la CPU, c'est très cher. P>
8 lumières est la limitation du pipeline GL fixe, où vous les permettez à chacun d'entre eux, de définir le mode, les paramètres, etc. Vous avez maintenant des shaders de pixels, et l'éclairage est effectué dans Shader. Là, vous pouvez utiliser un grand nombre de forts> dynamiques forts> (non cuites aux textures). Il suffit de fournir suffisamment toutes les paramètres de ces voyants (peut-être, dans une texture) et testez le nombre de lumières que votre shader est capable de traiter. En outre, dans Shader, vous pouvez cogner des lumières trop faibles (contribuant trop peu de valeur de pixels) ou simplement trop lointain. P>
MISE À JOUR: Shader complexe à ramification peut même générer des lumières (penser à la longue rue ou à l'arbre de Noël). Il pourrait être plus efficace que de fournir un grand nombre de paramètres. P>
MISE À JOUR: Cette technique a été discutée beaucoup, voici un lien: OpenGL. org / discussion_boards / ...
Les lumières faibles ne sont pas une caractéristique des shaders, car la capacité d'activer / désactiver des lumières pourrait être effectuée en dehors de la pipeline fixe concevant un gestionnaire de lumière, ce qui permet uniquement d'importantes lumières.
Light Manager active / désactive des feux pour une scène entière. Pixel Shader pourrait le faire par pixel, voir la différence? À propos, 8 lumières dans le pipeline traditionnel sont Per-Vertex, tandis que Shader effectue un éclairage par pixel - une chose différente.
Je vois la différence, mais de votre réponse semble que Shader fait tout cela (par pixels), mais l'éclairage de Vertex a un joli look, et il est toujours valable dans le monde actuel, même avec des shaders.
Une fois que vous comparez Per-Vertex et ombrage par pixel, vous retournerez à peine à l'ancien ... Pensez à la cartographie des bosses, au mappage de parallaxe, aux réflexions et autres effets.
L'éclairage est un sujet très complexe dans les graphiques informatiques. P>
Ce qui compte vraiment, bien sûr, l'illumination d'objet, émulant l'éclairage du monde réel ou l'effet que nous ciblons. L'environnement d'éclairage pourrait être composé de nombreuses sources afin de se rapprocher de l'effet réel que nous essayons d'atteindre. P>
La mise en oeuvre d'éclairage OpenGL sont des lumières dynamiques, qui sont une abstraction de point d'éclairage qui permettent de "lumière" (c'est-à-dire, donnez une couleur) aux sommets rendus (utilisés pour les triangles de rendu). ... Le sommet est illuminé, obtenez une contribution de couleur pour chaque lumière. P>
Comme vous l'avez mentionné, le processus de rendu prend plus de temps supplémentaire que nous avons activé. Pour minimiser cela, vous avez des possibilités différentes. P>
L'éclairage fixe OpenGLL contribue à la couleur de sommet, qui est interpolée avec d'autres couleurs de sommet afin de raster le triangle. Dans le cas où la géométrie est composée de quelques triangles, vous ne pouvez voir aucun cône de lumière à l'intérieur de chaque triangle, car la couleur de sa fragment est le résultat de l'interpolation de trois couleurs (les trois sommets). P>
Pour obtenir un éclairage plus précis, le logiciel doit déterminer chaque fragment de couleur (pixel) de la même manière qu'un sommet est coloré par des lumières, mais comme vous pouvez comprendre, il pourrait y avoir plus de pixels que les sommets. Une approche consiste à calculer (en utilisant des shaders ou une extension OpenGL) la contribution de la lumière pour chaque pixel de la géométrie pendant la phase de rastralisation ou déterminez la couleur de pixel à l'aide de l'éclairage différé. P>
L'éclairage différé utilise plusieurs textures (correspondant à la fenêtre) pour stocker des paramètres de lumières pour chaque pixel affiché. De cette façon, vous exécutez un calcul de la lumière après la production de l'image, déterminez la contribution de la lumière de pixel une fois pour chaque pixel, au lieu d'une fois pour chaque pixel de géométrie. P>