Minecraft est un jeu qui est largement basé sur une carte de hauteur et utilise ces informations de carte de hauteur pour inonder le monde de lumière. D'après ma compréhension, le point le plus élevé de la carte des hauteurs est la fin de la zone influencée par la lumière du soleil. Tout ce qui est au-dessus est éclairé par la lumière du soleil, tout ce qui est juste en dessous est influencé par la lumière à proximité dans un rayon de 8 blocs.
Ainsi, si vous avez une île flottante au sommet de votre monde, tout ce qui se trouve en dessous sera essentiellement considéré comme une grotte. Lorsque deux lumières influencent le même point, la lumière la plus brillante l'emporte (incertain à ce sujet).
Quoi qu'il en soit, il y a quelques problèmes avec le modèle d'éclairage des mini-métiers: tout d'abord, si votre monde n'a pas de carte de hauteur, il devient plus difficile de comprendre ce qui est censé émettre la lumière du soleil et ce qui ne l'est pas. Un moyen simple serait de supposer que le monde est (dans mon cas) un rocher flottant, puis de traverser chaque axe dans les deux sens et de déterminer où le rocher commence et se termine. Mais cela n'élimine pas complètement le problème car les bosses dans la roche ne sont pas censées être dans l'obscurité.
Minecraft lui-même mettra en cache les informations de lumière dans ses morceaux avec les informations sur le matériau d'un bloc. Ainsi, seulement si le monde est modifié, l'éclairage doit être mis à jour. Malheureusement, ce processus est encore assez lent sur les mises à jour et sur les changements rapides de lumière, on peut voir le retard d'éclairage. Cela est particulièrement vrai si beaucoup de blocs changent (TNT, coucher de soleil, etc.) et que vous n'utilisez pas l'ordinateur le plus rapide (ou Java sur Mac).
De ma compréhension encore limitée de l'éclairage graphique 3D, un monde comme minecraft ne devrait pas être le plus gros problème. Comment aborderiez-vous le problème?
Je pense que les exigences de base pour l'éclairage dans un monde voxel seraient
- mettre à jour assez rapidement pour que cela puisse se produire dans une seule image. On pourrait être en mesure de faire l'éclairage dans le périphérique graphique et de télécharger les informations de lumière modifiées dans la RAM principale.
- les informations sur la lumière doivent être rapidement disponibles pour la logique principale du jeu, donc pas entièrement basées sur le périphérique graphique: raisonnement: la lumière affecte la croissance de l'herbe, le frai des monstres, etc.
- les mises à jour légères devraient être locales à un morceau ou avoir une autre limite pour que l'on n'ait pas à rallumer le monde entier qui pourrait être de très grande taille.
L'idée principale serait de rendre les mises à jour lumineuses rapides, pas forcément plus belles. Pour des améliorations générales des performances de rendu de la lumière, on pourrait facilement ajouter SSAO en plus de ce qui devrait se traduire par des mondes beaucoup plus agréables.
Vous ne pouvez pas utiliser GPU Render to Texture et double-buffer vos résultats afin que vous ayez toujours des informations d'éclairage calculées disponibles pour relire chaque image?
La façon dont vous organiseriez ces données pour l'éclairage dépend entièrement de vous, mais je ne vois pas pourquoi cela ne devrait pas être la première option d'enquête si tout ce que vous cherchez à faire est d'améliorer la vitesse de votre algorithme d'éclairage ..?
la source
Les gens du rendu en temps réel semblent avoir une petite histoire d'amour avec Minecraft. Il y a eu un commentaire sur la façon dont ils n'ont pas encore compris l'éclairage .. mais vous voudrez peut-être rester à l'écoute pour d'autres développements / liens.
http://www.realtimerendering.com/blog/?s=minecraft
la source